9

在 Python 中,我通过将二进制文件读入字符串然后使用struct.unpack(...). 现在我想使用 写入该字符串struct.pack_into(...),但我收到错误"Cannot use string as modifiable buffer"。什么是适合与struct模块一起使用的缓冲区?

4

3 回答 3

7

如另一个答案所述,struct_pack可能是您需要并且应该使用的全部内容。但是,数组类型的对象支持缓冲区协议并且可以修改:

>>> import array, struct
>>> a = array.array('c', ' ' * 1000)
>>> c = 'a'; i = 1
>>> struct.pack_into('ci', a, -0, c, i)
>>> a
array('c', 'a\x00\x00\x00\x01\x00\x00\x00  ...

最初的缓冲区协议主要用于 C 扩展。在 Python 3(以及即将到来的 2.7)中,它已被新的 C 级缓冲区 API 和 memoryview 对象弃用并取代。

于 2009-11-14T00:30:50.030 回答
6

如果您不想将其打包到特定对象中,只需使用它struct.pack来返回一个字符串。

否则,ctypes.create_string_buffer是获取可变缓冲区的一种方法。

于 2009-11-14T00:12:45.387 回答
-1

两种可能性立即浮现在脑海:

  • 您可以使用 Python stringio模块创建具有文件语义的读/写缓冲区。

  • 您可以使用 Python数组模块来获取一个缓冲区,您可以将其视为一个列表,但它只包含二进制字节。

于 2009-11-14T00:31:13.010 回答