什么是适合Python的struct模块的缓冲区

时间:2009-11-14 00:01:22

标签: python binary buffering

在Python中,我通过将其读入字符串然后使用struct.unpack(...)来访问二进制文件。现在我想使用struct.pack_into(...)写入该字符串,但是我收到错误“不能将字符串用作可修改的缓冲区”。什么是适用于struct模块的缓冲区?

3 个答案:

答案 0 :(得分:7)

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

>>> 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中的new C-level buffer API and memoryview objects取代(在即将发布的2.7中)。

答案 1 :(得分:6)

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

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

答案 2 :(得分:-1)

立即想到两种可能性:

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

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