Python的struct模块适合的缓冲区是什么?
在Python中,我通过将一个二进制文件读入一个字符串来访问它,然后使用struct.unpack(...)
来处理数据。现在我想用struct.pack_into(...)
把数据写入这个字符串,但我遇到了一个错误,提示"无法将字符串用作可修改的缓冲区"。那么,使用struct
模块时,什么样的缓冲区比较合适呢?
3 个回答
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(以及即将到来的2.7版本)中引入的新C级缓冲区API和内存视图对象。
6
如果你不想把数据放进一个特定的对象里,那就直接用 struct.pack
来返回一个字符串。
如果你需要一个可以修改的缓冲区,ctypes.create_string_buffer
是一种获取可变缓冲区的方法。