struct.pack behavior

Discussion in 'Python' started by Steven Clark, Jun 26, 2008.

  1. Steven Clark

    Steven Clark Guest

    Can anyone explain to me why
    struct.pack('HB',1,2) gives 3 bytes, whereas struct.pack('BH',1,2)
    gives 4 bytes?

    -Steven
     
    Steven Clark, Jun 26, 2008
    #1
    1. Advertising

  2. Steven Clark

    John Machin Guest

    On Jun 26, 9:00 am, "Steven Clark" <> wrote:
    > Can anyone explain to me why
    > struct.pack('HB',1,2) gives 3 bytes, whereas struct.pack('BH',1,2)
    > gives 4 bytes?
    >

    Alignment -- read the manual.
     
    John Machin, Jun 26, 2008
    #2
    1. Advertising

  3. Steven Clark

    Steven Clark Guest

    On Wed, Jun 25, 2008 at 7:03 PM, John Machin <> wrote:
    > On Jun 26, 9:00 am, "Steven Clark" <> wrote:
    >> Can anyone explain to me why
    >> struct.pack('HB',1,2) gives 3 bytes, whereas struct.pack('BH',1,2)
    >> gives 4 bytes?
    >>

    > Alignment -- read the manual.
    > --
    > http://mail.python.org/mailman/listinfo/python-list
    >


    If "the manual" is the help files for the struct module, I've read it
    several times over. I understand endianness; I don't understand
    alignment. Could anyone give a less cryptic / terse answer?
     
    Steven Clark, Jun 26, 2008
    #3
  4. En Wed, 25 Jun 2008 23:38:54 -0300, Steven Clark
    <> escribi�:

    > On Wed, Jun 25, 2008 at 7:03 PM, John Machin <>
    > wrote:
    >> On Jun 26, 9:00 am, "Steven Clark" <> wrote:
    >>> Can anyone explain to me why
    >>> struct.pack('HB',1,2) gives 3 bytes, whereas struct.pack('BH',1,2)
    >>> gives 4 bytes?
    >>>

    >> Alignment -- read the manual.

    >
    > If "the manual" is the help files for the struct module, I've read it
    > several times over. I understand endianness; I don't understand
    > alignment. Could anyone give a less cryptic / terse answer?


    A good start might be this Wikipedia article:
    <http://en.wikipedia.org/wiki/Data_structure_alignment>

    --
    Gabriel Genellina
     
    Gabriel Genellina, Jun 26, 2008
    #4
  5. Steven Clark

    John Machin Guest

    On Jun 26, 12:38 pm, "Steven Clark" <> wrote:
    > On Wed, Jun 25, 2008 at 7:03 PM, John Machin <> wrote:
    > > On Jun 26, 9:00 am, "Steven Clark" <> wrote:
    > >> Can anyone explain to me why
    > >> struct.pack('HB',1,2) gives 3 bytes, whereas struct.pack('BH',1,2)
    > >> gives 4 bytes?

    >
    > > Alignment -- read the manual.
    > > --
    > >http://mail.python.org/mailman/listinfo/python-list

    >
    > If "the manual" is the help files for the struct module, I've read it
    > several times over. I understand endianness; I don't understand
    > alignment. Could anyone give a less cryptic / terse answer?


    google("struct alignment")
     
    John Machin, Jun 26, 2008
    #5
  6. Steven Clark

    Steven Clark Guest

    > For efficiency reasons many CPUs require particular primitive data
    > types (integers/pointers of various sizes) to be placed in memory at
    > particular boundaries. For example, shorts ("H" above, usually two bytes
    > and probably always so in the struct module) are often required to be
    > on even addresses, and longer objects to be on 4 or 8 byte boundaries.
    >
    > This allows for much more efficient memory access on many platforms
    > (of course the rules depend on the platform). Although RAM _appears_ to
    > the random access to arbitrary bytes, the underlying hardware will often
    > fetch chunks of bytes in parallel. If a number spanned the boundaries of
    > such a chunk it would require two fetch cycles instead of one. So
    > this is avoided for performance reasons.
    >
    > So, packing "HB" puts a short at offset 0 (even) and then a byte.
    > Conversely, packing "BH" puts a byte at offset zero but puts the short
    > at offset 2 (to be even), leaving a gap after the byte to achieve this,
    > thus the 4 byte size of the result (byte, gap, short).
    >
    > This layout procedure is called "alignment".
    >
    > Cheers,
    > --
    > Cameron Simpson <> DoD#743
    > http://www.cskk.ezoshosting.com/cs/



    Thanks for taking the time to type a detailed, helpful response,
    Cameron. Much appreciated!
     
    Steven Clark, Jun 28, 2008
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Fogelklou
    Replies:
    36
    Views:
    1,438
    Chris Fogelklou
    Apr 20, 2004
  2. Oren Tirosh
    Replies:
    1
    Views:
    2,253
    Troy Melhase
    Jun 28, 2003
  3. Tim Jones
    Replies:
    0
    Views:
    401
    Tim Jones
    Jan 31, 2004
  4. Sergey Dorofeev

    struct.(un)pack and ASCIIZ strrings

    Sergey Dorofeev, Jun 18, 2005, in forum: Python
    Replies:
    2
    Views:
    391
    John Machin
    Jun 19, 2005
  5. Alexander Farber

    pack 'C3U*' not same as pack 'C3(xC)*'

    Alexander Farber, Jun 23, 2005, in forum: Perl Misc
    Replies:
    2
    Views:
    167
    Ilmari Karonen
    Jun 23, 2005
Loading...

Share This Page