2010年5月27日星期四

Python的struct.pack函数的一点小小需要注意的地方

struct包是用来对数据和二进制字符串进行相互转换的,如果不讲求效率,这东西还是蛮好用的。上个星期在摆弄的时候,忽然发现了一个有趣的地方:

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

>>> struct.pack('=BH',1, 200)
'\x01\xc8\x00'

没有评论:

发表评论