On 2005-06-14, Matt Feinstein <no****@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!!!