struct.pack behavior

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Steven Clark

    struct.pack behavior

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

    -Steven
  • John Machin

    #2
    Re: struct.pack behavior

    On Jun 26, 9:00 am, "Steven Clark" <steven.p.cl... @gmail.comwrote :
    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.

    Comment

    • Steven Clark

      #3
      Re: struct.pack behavior

      On Wed, Jun 25, 2008 at 7:03 PM, John Machin <sjmachin@lexic on.netwrote:
      On Jun 26, 9:00 am, "Steven Clark" <steven.p.cl... @gmail.comwrote :
      >Can anyone explain to me why
      >struct.pack('H B',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?

      Comment

      • Gabriel Genellina

        #4
        Re: struct.pack behavior

        En Wed, 25 Jun 2008 23:38:54 -0300, Steven Clark
        <steven.p.clark @gmail.comescri bi�:
        On Wed, Jun 25, 2008 at 7:03 PM, John Machin <sjmachin@lexic on.net>
        wrote:
        >On Jun 26, 9:00 am, "Steven Clark" <steven.p.cl... @gmail.comwrote :
        >>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.or g/wiki/Data_structure_ alignment>

        --
        Gabriel Genellina

        Comment

        • John Machin

          #5
          Re: struct.pack behavior

          On Jun 26, 12:38 pm, "Steven Clark" <steven.p.cl... @gmail.comwrote :
          On Wed, Jun 25, 2008 at 7:03 PM, John Machin <sjmac...@lexic on.netwrote:
          On Jun 26, 9:00 am, "Steven Clark" <steven.p.cl... @gmail.comwrote :
          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")

          Comment

          • Steven Clark

            #6
            Re: struct.pack behavior

            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 <cs@zip.com.auD oD#743
            http://www.cskk.ezoshosting.com/cs/

            Thanks for taking the time to type a detailed, helpful response,
            Cameron. Much appreciated!

            Comment

            Working...