Python可写缓冲区/内存视图到数组/字节数组/ctypes字符串缓冲区

2024-01-12

Problem:

  • 固定大小记录的二进制数据
  • 想要使用struct.unpack_from和struct.pack_into来操作二进制数据
  • 不需要数据副本
  • 想要内存中的多个视图来简单地抵消计算等。
  • 数据可以位于 array.array bytearray 或 ctypes 字符串缓冲区中

我尝试做的事情:

part1 = buffer(binary_data, 0, size1)
part2 = buffer(binary_data, size1, size2)
part3 = buffer(binary_data, size1 + size2) # no size is given for this one as it should consume the rest of the buffer
struct.pack_into('I', part3, 4, 42)

这里的问题是 struct.pack_into 抱怨缓冲区是只读的。我研究了内存视图,因为它们可以创建读/写视图,但是它们不允许您像缓冲区函数那样指定偏移量和大小。

如何将多个零拷贝视图放入可读、可写并且可以使用 struct.unpack_from 和 struct.pack_into 访问/修改的字节缓冲区中


在 2.6+ 中,ctypes 数据类型有from_buffer采用可选偏移量的方法。它需要一个可写的缓冲区,否则将引发异常。 (对于只读缓冲区有from_buffer_copy.) 这是使用 ctypes 的示例的快速翻译char arrays:

from ctypes import *
import struct

binary_data = bytearray(24)
size1 = size2 = 4
size3 = len(binary_data) - size1 - size2

part1 = (c_char * size1).from_buffer(binary_data)
part2 = (c_char * size2).from_buffer(binary_data, size1)
part3 = (c_char * size3).from_buffer(binary_data, size1 + size2)
struct.pack_into('4I', part3, 0, 1, 2, 3, 4)

>>> binary_data[8:]
bytearray(b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00')

>>> struct.unpack_from('4I', part3)
(1, 2, 3, 4)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python可写缓冲区/内存视图到数组/字节数组/ctypes字符串缓冲区 的相关文章

随机推荐