2016-12-16 2 views
0

시뮬레이션 도구에서 일부 측정 지점을 포함하는 바이너리 파일을 얻습니다. 필자가해야 할 일은 측정 값을 파싱하여 목록에 저장하는 것입니다.바이너리 데이터 구문 분석 문제

는 도구의 문서에 따르면, 파일의 데이터 구조는 다음과 같습니다

First 16 bytes are always the same: 

Bytes 0 - 7 char[8]  Header 
Byte 8  u. char  Version 
Byte 9  u. char  Byte-order (0 for little endian) 
Bytes 10 - 11 u. short Record size 
Bytes 12 - 15 char[4]  Reserved 

The quantities are following: (for example one double and one float): 

Bytes 16 - 23 double  Value of quantity one 
Bytes 24 - 27 float  Value of quantity two 

Bytes 28 - 35 double  Next value of quantity one 
Bytes 36 - 39 float  Next value of quantity two 

나는 또한 알고, 인코딩이 리틀 엔디안이다.

내 유스 케이스에는 두 가지 수량이 있지만 둘 다 수레입니다.

내 코드는 지금까지 다음과 같습니다

def parse(self, filePath): 
    infoFilePath = filePath+ '.info' 
    quantityList = self.getQuantityList(infoFilePath) 

    blockSize = 0 
    for quantity in quantityList: 
     blockSize += quantity.bytes 

    with open(filePath, 'r') as ergFile: 
     # read the first 16 bytes, as they are not needed now 
     ergFile.read(16) 

     # now read the rest of the file block wise 
     block = ergFile.read(blockSize) 
     while len(block) == blockSize: 
      for q in quantityList: 
       q.values.append(np.fromstring(block[:q.bytes], q.dataType)[0]) 
       block = block[q.bytes:] 
      block = ergFile.read(blockSize) 

    return quantityList 

QuantityList 이전 함수에서 제공하고 수량 구조가 포함되어 있습니다. 각 수량에는 이름, 데이터 유형, 바이트라는 lenOfBytes 및 값이라는 값에 대한 준비된 목록이 있습니다. 구문 분석 기능은 내가 matplotlib와 첫 수량을 플롯 완료되면

dataType = "<f" 
bytes = 4 
values=[] 

:

그래서 내 유스 케이스에 두 개의 수량이 있습니다. 첨부 된 이미지에서 볼 수 있듯이 파싱하는 동안 문제가 발생했습니다.

내 분석 값 : My parsed values

기준은 : The reference

그러나 나는 내 잘못을 찾을 수 없습니다입니다.

+0

이것이 데이터 또는 프로그램 문제인지 확인하기 위해 자체 테스트 데이터 세트를 만들었습니까? –

+0

예, 참조가 생성되었습니다. 이진 파일이 올바른지 확인하십시오. – gismo

+0

데이터 유형에 대해 생각하십니까?docu는 float가 32 비트이고 double이 64 비트 값이라는 것을 알려줍니다. – gismo

답변

0

오늘 아침 내 문제를 해결할 수있었습니다.

해결책이 더 쉬울 수 없습니다.

... 
with open(ergFilePath, 'rb') as ergFile: 
... 

공지 모드로 'RB'에서 'R'의 변화 :

나는에

... 
with open(ergFilePath, 'r') as ergFile: 
... 

변경되었습니다.

파이썬 다큐 나를 위해 명확한 상황을 만든 : 바이너리 파일을 열 때

따라서

, 당신은 휴대 성을 개선하는 데에도 도움이됩니다 바이너리 모드로 파일을 열려면 모드로 값을 'B'를 추가한다 . (추가 'B'는도 진 치료 및 텍스트 파일 다르게,이 문서의 역할을 어디하지 않는 시스템에 유용합니다.)

그래서 최종 분석 된 값은 다음과 같이 :

Final values