struct.unpack和struct.pack如何工作?

时间:2014-02-15 10:03:53

标签: python struct

我目前正在尝试学习如何解析PPM文件。我在python解释器中执行了以下操作:

>>> x = open('file.ppm')
>>> x.readline()
'P6\n'
>>> x.readline()
'2 3\n'
>>> x.readline()
'255\n'
>>> x.readline()
'\n'
>>> x.readline()
'\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01'

我理解PPM文件的基本结构。不过,我对最后一行最为好奇。包含像素颜色信息的字节编码。上面的文件应解析回

P6
2 3
255
10 23 52 82 3 215 30 181 101 33 45 205 40 68 92 111 76 1

通过使用struct.pack('B',x),我看到整数被打包到上面的字节编码中。但是,我不确定如何使用struct.unpack撤消此过程。最重要的是,我不确定在哪里切断每个字节编码,因为它们都出现在同一行上,并且每个字节编码看起来都不一样(?)。

我还尝试通过struct.pack('I','\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01')打包整行。我不明白为什么它不能直接将字节编码转换成整数。

如何使用struct.pack(...)将字节编码解析为整数?此外,当这些值被打包/解包时会发生什么?

1 个答案:

答案 0 :(得分:0)

前三个字符串未由struct.pack打包。如果你想删除周围的空格,只需使用它们striprstrip

>>> 'P6\n'
'P6\n'
>>> 'P6\n'.rstrip()
'P6'

最后一个字节:

>>> b = b'\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01'
>>> struct.unpack('%dB' % len(b), b)
(23, 52, 82, 3, 215, 30, 181, 101, 33, 45, 205, 40, 68, 92, 111, 76, 1)

或使用bytearray :(您可以在Python 3.x中使用bytes);迭代bytearray会产生int s。

>>> list(bytearray(b))
[23, 52, 82, 3, 215, 30, 181, 101, 33, 45, 205, 40, 68, 92, 111, 76, 1]

注意正如Martijn Pieters评论的那样,当你处理二进制数据时,最好用二进制模式打开文件。

f = open('file.ppm', 'rb') # b: binary mode