Python:如何使用struct.pack_in将不同类型的数据打包到字符串缓冲区中

2024-06-01 03:19:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一些未签名的int数据打包到使用ctypes.create_string_buffer创建的字符串缓冲区中。

下面是代码段,以及显示错误on codepad的运行示例:

import struct
import ctypes
import binascii

buf = ctypes.create_string_buffer(16)
struct.pack_into("=I=I=I", buf, 0, 1, 2, 3)
print binascii.hexlify(buf)

这会产生以下错误:

...
struct.error: bad char in struct format

如果底层缓冲区是特定的C类型,那么文档并没有提到是否可以打包不同类型的数据。在本例中,尝试将未签名的int数据打包到具有基础c_char类型的字符串缓冲区中。任何人都知道这样做的解决方案,或者是否有一种特定的方法来创建可以打包任何类型数据的缓冲区?


Tags: 数据字符串import类型stringbuffer错误create
3条回答

不应该在每个输出说明符前加上“=”代码。就说一次:

struct.pack_into("=III", buf, 0, 1, 2, 3)

这将产生:

01000000020000000300000000000000

很抱歉让老话题死灰复燃,但我明白了“啪”的意思——可能是被类似的背景习惯击中了。

“格式字符串的第一个字符可用于指示压缩数据的字节顺序、大小和对齐方式”我同意。但是:

  • Python文档故意(?)甚至省略一个使用顺序格式化程序的示例(所有示例都假定本机字节顺序、大小和与大端机的对齐方式。
  • 有人可能会假设(正如我和可能snap所做的那样,“III”由三个格式字符串组成,我们可以随意格式化它们中的每一个。因此=I=I=I。在习惯了Ruby的array.pack之后,我就自食其果了,在这里人们可以沿着表达式自由地改变顺序(在本例中,Ruby的等价物是I_I_I_,因为order selector在type之后)。

因此,我想最好在struct.pack/unpack docs中添加几行,给出使用order&padding的示例(meh,padding对我的打击更大。。。我可以忍受当地的秩序,但填充破坏了我的礼节)。

标准操作程序:读取错误消息。

“结构格式的坏字符”是指它所说的内容。

标准操作程序:检查文档Here它说“格式字符串的第一个[my emphasis]字符可用于指示压缩数据的字节顺序、大小和对齐方式”,并继续列出=作为一种可能。下一节(格式化字符)列出许多字母包括I

结论:您的格式字符串应该是"=III"

注意:这个问题与目标缓冲区无关,更不用说它的底层C类型了:

>>> import struct
>>> struct.pack("=I=I=I", 1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: bad char in struct format
>>> struct.pack("=III", 1, 2, 3)
'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
>>> 

相关问题 更多 >