我正在尝试将一些unsigned 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类型,则文档不会提示您是否可以打包不同类型的数据。在这种情况下,尝试将unsigned int数据打包到具有底层c_char类型的字符串缓冲区中。有人知道这样做的解决方案,还是有特定的方法来创建可以打包任何类型数据的缓冲区?
答案 0 :(得分:12)
您不应该使用'='代码为每个输出说明符添加前缀。只说一次:
struct.pack_into("=III", buf, 0, 1, 2, 3)
这会产生:
01000000020000000300000000000000
答案 1 :(得分:4)
对于复活旧主题感到抱歉,但我得到了“快照”的意思 - 被类似的背景习惯所打击。
“格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐”我同意。但是:
III
”由三个格式字符串组成,我们可以随意格式化每个格式字符串。因此=I=I=I
。在习惯了Ruby的array.pack之后,我自己开始尝试,在这里可以自由地改变表达式的顺序(在这种情况下,Ruby的等价物是I_I_I_
,因为顺序选择器在类型之后。)因此我想在struct.pack / unpack docs中添加几行可能会很好,给出了order&的示例。 padding使用(meh,padding让我更加努力......我可以使用本机命令,但padding破坏了我的协议)。
答案 2 :(得分:1)
标准操作程序:阅读错误信息。
“struct format中的错误char”意味着它所说的。
标准操作程序:检查文档。 Here它说“格式字符串的第一个 [我的强调]字符可用于指示打包数据的字节顺序,大小和对齐”并继续列表{{ 1}}作为一种可能性。下一节(格式字符)列出了许多字母,包括=
。
结论:您的格式字符串应为I
。
注意:问题根本与目标缓冲区无关,更不用说它的底层C类型了:
"=III"