gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:08:01 27 4
gpt4 key购买 nike

我目前正在尝试学习如何解析 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 未对前三个字符串进行打包。所以只需使用它们(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

>>> 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

关于python - struct.unpack 和 struct.pack 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21796060/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com