我正在尝试将一些未签名的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类型的字符串缓冲区中。任何人都知道这样做的解决方案,或者是否有一种特定的方法来创建可以打包任何类型数据的缓冲区?
不应该在每个输出说明符前加上“=”代码。就说一次:
这将产生:
很抱歉让老话题死灰复燃,但我明白了“啪”的意思——可能是被类似的背景习惯击中了。
“格式字符串的第一个字符可用于指示压缩数据的字节顺序、大小和对齐方式”我同意。但是:
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类型了:
相关问题 更多 >
编程相关推荐