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

马特

问题:

  • 固定大小记录的二进制数据
  • 想要使用struct.unpack_from和struct.pack_in来操作二进制数据
  • 不需要数据副本
  • 希望有多个视图进入内存,以简单地抵消计算等。
  • 数据可以在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抱怨缓冲区是只读的。我已经研究过memoryviews,因为它们可以创建一个读/写视图,但是它们不允许您像缓冲区函数那样指定偏移量和大小。

如何完成将多个零复制视图放入一个可读,可写且可以使用struct.unpack_from和struct.pack_into进行访问/修改的字节缓冲区中

孙ry

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

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不是字符串或缓冲区。模块加密

来自分类Dev

缓冲区溢出-覆盖字符串

来自分类Dev

gsub!复制字符串的缓冲区?

来自分类Dev

将固定大小的缓冲区(字节数组)转换为字符串

来自分类Dev

Google协议缓冲区messag到字节数组C ++

来自分类Dev

Cassandra cppdriver查询字符串缓冲区溢出?

来自分类Dev

ORA-19011:字符串缓冲区太小

来自分类Dev

Python TypeError:预期的字符串或缓冲区

来自分类Dev

Python 3.5-ctypes-为Vijeo Citect创建字符串缓冲区

来自分类Dev

JSON TypeError:预期的字符串或缓冲区

来自分类Dev

Pyglet-TypeError:预期的字符串或缓冲区

来自分类Dev

ctypes不释放字符串缓冲区吗?

来自分类Dev

字符串缓冲区输入问题

来自分类Dev

gsub!复制字符串的缓冲区?

来自分类Dev

BASH:数组作为字符串缓冲区

来自分类Dev

TypeError:预期的字符串或缓冲区 Python

来自分类Dev

c ++字符串模式匹配缓冲区数据

来自分类Dev

如何从字节缓冲区打印字符串

来自分类Dev

Java中的字符串缓冲区问题

来自分类Dev

如何解析直接内存中的Google协议缓冲区而不在Java中分配堆字节数组?

来自分类Dev

使用缓冲区比较字符串

来自分类Dev

WSASend缓冲区到字符串

来自分类Dev

从缓冲区中提取字符串

来自分类Dev

将字符串缓冲区传递到数组到android中的列表

来自分类Dev

Python 3.5-ctypes-为Vijeo Citect创建字符串缓冲区

来自分类Dev

字符串/缓冲区中的EOF文件字符

来自分类Dev

字符串缓冲区不打印“字符”

来自分类Dev

缓冲区到字符串?

来自分类Dev

字符串的循环缓冲区