2016-11-30 10 views
1

私の目標は、mmap()とクラスを使ってバイナリファイルを読むことです。問題は、ファイルから取得したいデータがバイト位置0になく、オフセットが24であることです。このオフセットをmmap関数mmap.mmap(fd, length, access, offset = 24)に設定すると、オフセットが粒度の倍数でなければならないためエラーが発生します。私のコードは次のとおりです。mmapを使ってオフセット付きのバイナリファイルを読む

  • 全体のmmapを取得し、from_bufferの引数は()はmmapの部分配列である、後data = d_arrayHeaderLAS.from_buffer(mmap_file[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 
    

    は、私は3つの解決策を考えました。問題は、このサブアレイがmmapオブジェクトからstrに変換され、動作しないことです。
  • 2番目の解決策は、(コードの3行目に示すように)長さが24バイトの新しいフィールドを追加することでした。
  • 私はstruct.unpack()でそれを行う方法を知っていますが、それは遅いので、私はそれを使用したくありません。

mmapをオフセットで取得する簡単な方法があるかどうかを知りたいと思います。私が示したこのケースは簡単ですが、オフセットがヘッダーと等しいバイナリファイルからデータを取得するなど、より複雑な場合に使用したいと思います。これらのケースでは、ヘッダーとデータ構造が異なり、別のクラスを使用する必要があります。ファイルが大きすぎるので、高速です。

ありがとうございます。

+1

'from_buffer()' '・オフセット受け入れオフセットでファイルポインタを作るために使用することができます:' 'from_buffer(mmap_file、24)。 – acw1668

+0

ありがとう!私はそれがとても簡単だったことを知らなかった=) – Pablo

答えて

2

あなたは "mmap_file.seek(0)" ゼロ...

+0

ありがとう、それも動作しますが、@ acw1668私はfrom_buffer(mmap_file、offset) – Pablo

関連する問題