使用 mmap 读取具有偏移量的二进制文件
Read binary file with an offset using mmap
我的目标是使用 mmap() 和 class 读取二进制文件。问题是我想从文件中获取的数据不在字节位置 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 object 转换为 str,它不起作用。
- 第二种解决方案是添加一个长度为 24 字节的新字段(如代码第 3 行所示)。
- 我知道如何使用
struct.unpack()
,但我不想使用它,因为它比较慢。
我想知道是否有更简单的方法来获取带偏移量的 mmap。我展示的这种情况很简单,但我想在更复杂的情况下使用它,例如从偏移量等于 header 的二进制文件中获取数据。在这些情况下,header 和数据结构是不同的,我应该使用不同的 classes。而且我需要它很快,因为文件太大了。
谢谢。
您可以使用 "mmap_file.seek(0)" 使文件指针偏移量为零 ...
我的目标是使用 mmap() 和 class 读取二进制文件。问题是我想从文件中获取的数据不在字节位置 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 object 转换为 str,它不起作用。 - 第二种解决方案是添加一个长度为 24 字节的新字段(如代码第 3 行所示)。
- 我知道如何使用
struct.unpack()
,但我不想使用它,因为它比较慢。
我想知道是否有更简单的方法来获取带偏移量的 mmap。我展示的这种情况很简单,但我想在更复杂的情况下使用它,例如从偏移量等于 header 的二进制文件中获取数据。在这些情况下,header 和数据结构是不同的,我应该使用不同的 classes。而且我需要它很快,因为文件太大了。
谢谢。
您可以使用 "mmap_file.seek(0)" 使文件指针偏移量为零 ...