Xie&Tian wrote:
Hi
When I use struct to pack binary data, I found this interesting behaviour:
import struct
struct.pack('B', 1)
'\x01'
struct.pack('H', 200)
'\xc8\x00'
struct.pack('BH',1, 200)
'\x01\x00\xc8\x00'
struct.calcsize('BH')
4
Why does "struct.pack('BH',1, 200)" come out with an extra "\x00"?
To quote the help:
>>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).
C's standard rules say that when a smaller type is followed by a larger
one, padding is used so that the second field is aligned according to
its size. So a H type will be aligned to a 2byte boundary. If you had
two B's before it, no padding would be added.
In C, you can use a compiler switch or a pragma to override standard
alignment. Similarly, here you can use a prefix like "=" to override
the native alignment rules.
DaveA
--
http://mail.python.org/mailman/listinfo/python-list