从文件中读取和存储任意字节长度的整数

Posted

技术标签:

【中文标题】从文件中读取和存储任意字节长度的整数【英文标题】:Reading and storing arbitrary byte length integers from a file 【发布时间】:2012-07-16 15:57:29 【问题描述】:

我正在尝试通过在 numpy 中进行解析/数据累积来加速我去年编写的二进制文件解析器。 numpy 定义自定义数据结构并将二进制文件中的数据插入其中的能力看起来像我需要的,除了这些文件中的一些字段是“非标准”长度(例如 6 个字节)的无符号整数。由于我使用的是 Python 2.7,因此我制作了自己的 int.from_bytes 模拟版本来处理这些字段,但是如果有任何方法可以在 numpy 中将这些字段本地读取为整数,那显然会更快更可取。

【问题讨论】:

【参考方案1】:

Numpy 不支持任意字节长度的整数,使用 ctypes 位域会比它的价值更麻烦。

我建议使用矢量化切片将您的数据转换为下一个更高的标准大小整数:

buf = "000000111111222222"
a = np.ndarray(len(buf), np.dtype('>i1'), buf)
e = np.zeros(len(buf) / 6, np.dtype('>i8'))
for i in range(3):
    e.view(dtype='>i2')[i + 1::4] = a.view(dtype='>i2')[i::3]
[hex(x) for x in e]

【讨论】:

当我尝试调用 ndarray.view 时,我不断收到 ValueErrors,除非我使用与创建它相同的类型来调用它。避免这种情况的规则是什么? @dpitch40 通常应该可以使用 ndarray.view 给数组取别名;这可能是您的 numpy 版本的问题。您还可以使用 ndarray 构造函数和底层缓冲区,使用 arr.data。

以上是关于从文件中读取和存储任意字节长度的整数的主要内容,如果未能解决你的问题,请参考以下文章

从长度为无符号整数的 ByteBuffer 中读取 UTF-8 字符串

如何从以毫秒为单位的长度中找到以帧、字节和整数为单位的音符长度

如何从 32 位 R 整数中提取 4 位无符号整数?

当 TLV 字段使用 3 字节长度格式时,CoreNFC 不会读取

从套接字读取消息时如何获取字节序?

我如何显示一个字节的位长,而不是整数