2016-11-30 2 views
1

Моя цель - прочитать двоичный файл с помощью 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 со смещением. Этот случай, который я показал, прост, но я хотел бы использовать его в более сложных случаях, таких как получение данных из двоичного файла, где смещение равно заголовку. В этих случаях структуры заголовков и данных различаются, и я должен использовать разные классы. И мне это нужно быстро, так как файлы слишком большие.

спасибо.

+1

'from_buffer()' 'принимает offset':' from_buffer (mmap_file, 24) '. – acw1668

+0

Спасибо! Я не знал, что это так просто =) – Pablo

ответ

2

Вы можете использовать "mmap_file.seek (0)", чтобы указатель файла на смещение нулевой точки ...

+0

Спасибо, он тоже работает, но @ acw1668 ответил, что я могу использовать from_buffer (mmap_file, offset) – Pablo

Смежные вопросы