2016-11-30 1 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 
    

    나는 세 가지 솔루션을 생각했다. 문제는이 부분 배열이 mmap 객체에서 str로 변형되어 작동하지 않는다는 것입니다.
  • 두 번째 해결 방법은 길이가 24 바이트 인 새로운 필드를 추가하는 것입니다 (코드 3 행 참조).
  • 나는 struct.unpack()으로 그것을하는 방법을 알고있다, 그러나 느린이기 때문에 나는 그것을 사용하고 싶지 않을 것이다.

오프셋이있는 mmap을 얻는 쉬운 방법이 있는지 알고 싶습니다. 필자가 보여준이 사례는 쉽지만 오프셋이 헤더와 같은 이진 파일에서 데이터를 가져 오는 것과 같이 더 복잡한 경우에 사용하고 싶습니다. 이 경우 헤더와 데이터 구조가 다르기 때문에 다른 클래스를 사용해야합니다. 파일이 너무 크기 때문에 빨리 처리해야합니다.

감사합니다. `from_buffer (mmap_file, 24)`:

+1

'from_buffer는()'offset''받아들입니다. – acw1668

+0

고마워요! 나는 그것이 매우 쉽다는 것을 몰랐다 =) – Pablo

답변

2

당신은 제로 오프셋에 파일 포인터를 만들기 위해 "(0) mmap_file.seek"를 사용할 수 있습니다 ...

+0

감사합니다, 그것도 작동합니다,하지만 @ acw1668은 from_buffer (mmap_file, offset)을 사용할 수 있다고 대답했습니다. – Pablo