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

时间:2011-05-11 08:34:36

标签: python c struct

我正在尝试将一些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类型的字符串缓冲区中。有人知道这样做的解决方案,还是有特定的方法来创建可以打包任何类型数据的缓冲区?

3 个答案:

答案 0 :(得分:12)

您不应该使用'='代码为每个输出说明符添加前缀。只说一次:

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

这会产生:

01000000020000000300000000000000

答案 1 :(得分:4)

对于复活旧主题感到抱歉,但我得到了“快照”的意思 - 被类似的背景习惯所打击。

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

  • Python文档故意(?)省略了使用订单格式化程序的单个示例(所有示例假定本机字节顺序,大小和与big-endian机器对齐。
  • 可以假设(因为我和可能快照做了),“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"