Python struct.unpack和struct.pack是如何工作的?
我目前正在尝试学习如何解析PPM文件。我在python解释器中执行了以下操作:Python struct.unpack和struct.pack是如何工作的?,python,struct,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\x1
>>> 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(…)
将字节编码解析回整数?另外,在打包/解包这些值时会发生什么情况?前三个字符串不是由struct.pack
打包的。所以只需使用它们(strip
或rstrip
如果您想删除周围的空格)
对于最后的字节:
>>> 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)
或者使用:(您可以在Python3.x中使用);迭代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
阅读文档中的“格式字符串”部分可能会有所帮助:不要在文本模式下打开文件,请使用
.readline()
。在二进制模式下打开,请使用。读取(字节数)
改为读取节。在文本模式下,平台特定的行终止符被转换为\n
换行符,而这通常不是二进制文件读取时所需的换行符。您的一个而非最后一个.readline()的\n
是最后一个.readline()读取的节的一部分
例如。请注意,这确实需要将\n
作为数据的一部分。在文本模式下读取二进制格式可能不是一个好主意。
f = open('file.ppm', 'rb') # b: binary mode