Problem with 'struct' module

Grant Edwards grante at visi.com
Tue Jun 14 10:24:56 EDT 2005


On 2005-06-14, Matt Feinstein <nospam at here.com> wrote:

> Using the 'struct' module (Win32, python version 2.4.1)--
>
> The library documentation says that 'no alignment is required
> for any type'.

Right.  It says that for Standard alignment, and that's correct.

> However, struct.calcsize('fd') gives 16 while
> struct.calcsize('df') gives 12, implying that double precision
> data has to start on a double-word boundary. 

Your example is not using standard alignment.  It's using
native alignment:

    By default, C numbers are represented in the machine's native
    format and byte order, and properly aligned by skipping pad
    bytes if necessary (according to the rules used by the C
    compiler).

    Alternatively, the first character of the format string can
    be used to indicate the byte order, size and alignment of
    the packed data, according to the following table:

       Character    Byte order            Size and alignment
         @            native                   native
         =            native                   standard
         <            little-endian            standard
         >            big-endian               standard
         !            network (= big-endian)   standard

    If the first character is not one of these, "@" is assumed.
    
    Native byte order is big-endian or little-endian, depending
    on the host system. For example, Motorola and Sun
    processors are big-endian; Intel and DEC processors are
    little-endian.

    Native size and alignment are determined using the C compiler's
    sizeof expression. This is always combined with native byte
    order.

    Standard size and alignment are as follows: no alignment is
    required for any type (so you have to use pad bytes); short is
    2 bytes; int and long are 4 bytes; long long (__int64 on
    Windows) is 8 bytes; float and double are 32-bit and 64-bit
    IEEE floating point numbers, respectively.

    Note the difference between "@" and "=": both use native
    byte order, but the size and alignment of the latter is
    standardized. 

-- 
Grant Edwards                   grante             Yow!  ... I want FORTY-TWO
                                  at               TRYNEL FLOATATION SYSTEMS
                               visi.com            installed withinSIX AND A
                                                   HALF HOURS!!!



More information about the Python-list mailing list