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

9 投票
3 回答
8396 浏览
提问于 2025-04-15 15:59

在Python中,我通过将一个二进制文件读入一个字符串来访问它,然后使用struct.unpack(...)来处理数据。现在我想用struct.pack_into(...)把数据写入这个字符串,但我遇到了一个错误,提示"无法将字符串用作可修改的缓冲区"。那么,使用struct模块时,什么样的缓冲区比较合适呢?

3 个回答

-1

有两种方法立刻浮现在脑海中:

  • 你可以使用Python的 stringio 模块来创建一个可以读写的缓冲区,感觉就像在操作文件一样。

  • 你还可以使用Python的 array 模块来获得一个缓冲区,这个缓冲区可以像列表一样使用,但里面只会存放二进制字节。

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 是一种获取可变缓冲区的方法。

撰写回答