pack and unpack problems

Justin Johnson justinjohnson at fastmail.fm
Wed Jun 18 13:51:59 EDT 2003


Thanks a bunch.  That is very helpful.

On Wed, 18 Jun 2003 09:31:33 -0600, "Steven Taschuk"
<staschuk at telusplanet.net> said:
> Quoth Justin Johnson:
> > Would you mind explaining this for me?  What do you mean by check
> > alignment?  Sorry, this is kinda new for me.  In the meantime I'll go
> > read my orielly tcp book.  :-)
> 
> Some architectures constrain (some) values to occur "aligned" at
> certain boundaries in memory.  Structs on such platforms might
> need padding between their members to ensure proper alignment;
> e.g., instances of
>     struct foo {
>         char a;
>         int b;
>     }
> might be organized in memory by the C compiler as
>     0     1     2     3     4     5     6     7     8
>     |  a  |     padding     |           b           |
> where the padding makes sure b is aligned properly, but is not
> otherwise used.  (Obviously here the whole struct must also be
> aligned.)
> 
> But if you're parsing UDP packets, you know the exact layout and
> don't care what the platform's C compiler would do with a struct
> declaration.  Thus you want '!' for "standard alignment", which is
> to say, no alignment required at all.  ('!' also implies network
> byte order; see the docs.)
> 
> (Header layouts are, I suspect, designed with this kind of thing
> in mind, so values are aligned in sensible ways anyway.  Thus
> "parsing" a UDP packet in C could be as simple as casting a void *
> to a struct udpheader *.)
> 
> -- 
> Steven Taschuk                                    
> staschuk at telusplanet.net
> Receive them ignorant; dispatch them confused.  (Weschler's Teaching
> Motto)
> 
> -- 
> http://mail.python.org/mailman/listinfo/python-list
> 





More information about the Python-list mailing list