Моя цель - прочитать двоичный файл с помощью mmap() и класса. Проблема в том, что данные, которые я хочу получить из файла, не находятся в позиции байта 0, а смещение равно 24. Если я установил это смещение в функцию mmap mmap.mmap(fd, length, access, offset = 24)
, возникает ошибка, так как смещение должно быть кратным степени детализации , Мой код:Чтение двоичного файла со смещением с помощью mmap
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
Я думал три решения:
- Получения всей ММАП, а затем
data = d_arrayHeaderLAS.from_buffer(mmap_file[24:])
где аргумент from_buffer() является подмассивом ттара. Проблема заключается в том, что этот подмассив преобразуется из объекта mmap в str, и он не работает. - Второе решение состояло в том, чтобы добавить новое поле длиной 24 байта (как показано в строке 3 кода).
- Я знаю, как это сделать с
struct.unpack()
, но я бы не хотел его использовать, потому что он медленнее.
Я хотел бы знать, есть ли более простой способ получить mmap со смещением. Этот случай, который я показал, прост, но я хотел бы использовать его в более сложных случаях, таких как получение данных из двоичного файла, где смещение равно заголовку. В этих случаях структуры заголовков и данных различаются, и я должен использовать разные классы. И мне это нужно быстро, так как файлы слишком большие.
спасибо.
'from_buffer()' 'принимает offset':' from_buffer (mmap_file, 24) '. – acw1668
Спасибо! Я не знал, что это так просто =) – Pablo