John Machin wrote:

Robert Kern wrote:

Ethan Furman wrote:

Greetings,

I'm looking at the struct module for binary packing of ints and floats. The documentation refers to C datatypes. It's been many years since I looked at C, but I seem to remember that the data type sizes were not fixed -- for example, an int might be two byes on one machine, and four bytes on the next. Can any C programmers verify this? If it is true, does that mean that struct.pack('h', 8001) might give me different results depending on the machine it's running on?


Right. I believe (but could be wrong) that "char" is defined to be one byte, but that "short", "int", "long", and "long long" are defined as "at least as big as the previous type".

In practice, though, on nearly every machine that Python runs on, "char" is one byte, "short" is two bytes, and "int" is four bytes. "longs" and "long longs" tend to vary substantially, though; never assume sizes for them.

Single-precision floats are always four bytes and double-precision floats are always eight bytes. "long doubles" vary; they could be twelve bytes or sixteen.

If you want to deal with fixed sizes, use struct.calcsize() to test the sizes of each of the integer types, assign them to width-specific aliases, and always use these aliases.


This is all true if you want to operate in "native" mode; however in "standard" mode the sizes are fixed -- otherwise there'd be no easy way of reading/writing the fixed-size fields in many common file formats.

As the manual says:
"""
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.
"""

If, as I suspect, Ethan's purpose is be able to read/write files in a long-established PC file format, he will need to '<' for littleendian order, and an appropriate selection from bBhHiI and d will do what he needs.

HTH,
John
--
http://mail.python.org/mailman/listinfo/python-list

Next question: when using struct.pack to store an integer, I get a deprecation warning if the int is too big... I would rather have an error. Is there a setting somewhere that controls this?

>>> struct.pack('<i', 4294967295)
c:\python25\interact.py:1: DeprecationWarning: struct integer overflow masking is deprecated
'\xff\xff\xff\xff'

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to