시뮬레이션 도구에서 일부 측정 지점을 포함하는 바이너리 파일을 얻습니다. 필자가해야 할 일은 측정 값을 파싱하여 목록에 저장하는 것입니다.바이너리 데이터 구문 분석 문제
는 도구의 문서에 따르면, 파일의 데이터 구조는 다음과 같습니다
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=[]
:
그래서 내 유스 케이스에 두 개의 수량이 있습니다. 첨부 된 이미지에서 볼 수 있듯이 파싱하는 동안 문제가 발생했습니다.그러나 나는 내 잘못을 찾을 수 없습니다입니다.
이것이 데이터 또는 프로그램 문제인지 확인하기 위해 자체 테스트 데이터 세트를 만들었습니까? –
예, 참조가 생성되었습니다. 이진 파일이 올바른지 확인하십시오. – gismo
데이터 유형에 대해 생각하십니까?docu는 float가 32 비트이고 double이 64 비트 값이라는 것을 알려줍니다. – gismo