>>> 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
>>> struct.pack('B', 1)
'\x01'
>>> struct.pack('H', 200)
'\xc8\x00'
>>> struct.pack('BH',1, 200)
'\x01\x00\xc8\x00'
>>> struct.calcsize('BH')
4
可以看到,struct.pack('B', 1) 与 struct.pack('H', 200) 的结果之和和 struct.pack('BH', 1, 200) 的输出不一样。后者的结果中多了一个 '\x00'。想到我们一般都是用的CPython,这就好理解了。C的struct中存在内存对齐的做法,这样可以得到更好的性能。Python的struct包在默认情况下是不会干涉这一点的,所以就出现了上面的情况。想要去掉这个 '\x00' 也很简单,在格式字符串之前加上 '=' 即可,像这样:
>>> struct.pack('=BH',1, 200)
'\x01\xc8\x00'
'\x01\xc8\x00'
没有评论:
发表评论