使用mmap读取带偏移量的二进制文件

时间:2016-11-30 09:44:47

标签: python binary mmap

我的目标是使用mmap()和类读取二进制文件。问题是我想从文件中获取的数据不在字节位置0,偏移量是24.如果我将此偏移设置为mmap函数mmap.mmap(fd, length, access, offset = 24),则会引发错误,因为偏移必须是多个粒度。我的代码是:

class StructHeader(Structure):
    _pack_ = 1
    _fields_ = [('nothing', c_char*24),('v1', c_ubyte),('v2', c_ubyte)]

d_arrayHeader = StructHeader*1

if __name__ == '__main__':
    fd = os.open(filePath, os.O_RDWR)
    granularity = mmap.ALLOCATIONGRANULARITY

    mmap_file = mmap.mmap(fd, length=187, access=mmap.ACCESS_WRITE, offset=0)

    data = d_arrayHeader.from_buffer(mmap_file)

    i = data[0]

    print i.v1, i.v2

我想了三个解决方案:

  • 获取整个mmap以及之后的data = d_arrayHeaderLAS.from_buffer(mmap_file[24:]),其中from_buffer()的参数是mmap的子数组。问题是这个子阵列从mmap对象转换为str,它不起作用。
  • 第二个解决方案是添加一个长度为24字节的新字段(如代码第3行所示)。
  • 我知道如何使用struct.unpack(),但我不想使用它,因为它更慢。

我想知道是否有更简单的方法来获取带偏移量的mmap。我展示的这种情况很简单,但我想在更复杂的情况下使用它,例如从偏移量等于标题的二进制文件中获取数据。在这些情况下,标头和数据结构是不同的,我应该使用不同的类。我需要它很快,因为文件太大了。

谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用" mmap_file.seek(0)"使文件指针偏移零...