Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python struct.unpack和struct.pack是如何工作的?_Python_Struct - Fatal编程技术网

Python struct.unpack和struct.pack是如何工作的?

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

我目前正在尝试学习如何解析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(…)
将字节编码解析回整数?另外,在打包/解包这些值时会发生什么情况?

前三个字符串不是由
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