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

mdm*_*mdm 9 python binary buffering

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

Ned*_*ily 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  ...
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*off 6

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

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