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

Reply via email to