2017-09-13 11 views
0

구조체를 이진 파일로부터 언팩하려고하는데, 처음 4 바이트가 정수 64 (값 64)이고 다음 3 * 8 바이트가 3 배가된다는 것을 알고있다.파이썬 struct unpacking integer double로 시작한다.

with open('data', mode='rb') as file: 
    fileContent = file.read() 

가 그럼 난 시도해보십시오 :이 같은 포함한 FileContent라는 벡터에 데이터를 저장 한

print(struct.unpack("i", fileContent[0:4])) 

이 제대로 나는 또한 다음의 두 배를 읽고 싶은, 그러나 수 (64)를 인쇄 그래서 (12 바이트의 총 산출, 정수는 4 바이트이어야하며, 이중 8해야하기 때문에)

print(struct.unpack("id", fileContent[0:12])) 

위의 문을 수정합니다.

print(struct.unpack("d", fileContent[4:12]) 

나는 이중의 정확한 값을 얻을하지 않습니다 : 그러나, 나는 이중 만 사용을 읽으려고하면

또한

struct.error: unpack requires a bytes object of length 16

이 없다는 오류를 얻을! 위의 슬라이스를 [8:16]으로 변경하면 올바른 값을 얻을 수 있습니다. 누군가 설명해 주시겠습니까? 파일의 처음 4 바이트는 정수 여야하고 다음 8 바이트는 두 배가되어야한다는 것을 알고 있습니다. read()는 어떻게 든 정수를 0으로 채 웁니다, 아니면 계속 진행되고 있습니까?

+0

입력 구조가 패딩되어 'double'이 8 바이트에 정렬됩니다. –

+0

터미널에서 바이너리 덤프를 만들었고 '데이터'입력 파일이 패딩되지 않았습니다 (리틀 엔디안 컴퓨터에있는 계정, 처음 네 바이트는 01000000 00000000 00000000 00000000). 다음 바이트는 0이 아니며 그들이 플로트를 대표한다고 생각합니다. 거기에 자동으로 데이터를 패드 read() 함수와 무언가가 있습니까? – JezuzStardust

답변

0

unpack()은 자동으로 패딩을 수행합니다. 따라서 unpack('id', …)은 정수를 8 바이트로 채 웁니다. 따라서 "struct.error : unpack에 16 바이트 길이의 바이트 개체가 필요합니다"오류가 발생합니다.

그것은 쉽게 다음과 같이 볼 수 있습니다 :

>>> pack('id', 42, 42) 
b'*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\[email protected]' 

그러나 수정은 파일의 엔디안을 알고, 당신은 그것을 지정해야하고, 그것을도 명시하여, 패딩이 비활성화됩니다, 쉽게 :

>>> unpadded = pack('>id', 42, 42) 
>>> len(unpadded) 
12 
>>> unpack('>id', unpadded) 
(42, 42.0)