2012-04-19 1 views
1

b '\ x00 \ x00 \ x00 \ x01'의 정수 값을 가져 오려고합니다. 이는 1이어야합니다.파이썬 구조체 모듈 - 언팩시 홀수 값

'1'값을 얻으려면 여러 가지를 시도했지만, 대신 실제로 높은 숫자를 얻습니다.

내가 뭘하려 :

import struct 
from struct import * 

#I had 4 int values: 
byte1 = 0 
byte2 = 0 
byte3 = 0 
byte4 = 1 

#I packed each to one byte (seems weird, one int to 1 byte - so is this correct?) 
byte1 = struct.pack('b', byte1) #returns b'\x00' 
byte2 = struct.pack('b', byte2) 
byte3 = struct.pack('b', byte3) 
byte4 = struct.pack('b', byte4) #returns b'\x01' 

#Now i place all those bytes in one container 
con = byte1+byte2+byte3+byte4 #returns b'\x00\x00\x00\x01' 

#hmm ..returns 4 - so seems alright? 
len(con) 

#tried several things: 
struct.unpack('I', con) #unsigned int - returns 16777216 (what!?) 
struct.unpack('i', con) #signed int - returns the same as above 
unpack('I', con) #same .. 

내 질문; 내가 뭔가 잘못하고 있는거야? 내가 뭔가 잘못 이해하고 있니? 누군가가 '(1,)'을 표시하지 않는 이유를 설명해 주실 수 있습니까?

int rep를 얻는 또 다른 방법이있는 경우. 저에게도 알려주십시오.

친절하게 답해 주셔서 감사합니다.

답변

4

결과를 리틀 엔디안으로 해석하지만 빅 엔디안으로 해석해야합니다. 올바른 endianness을 사용하려면

>>> con = b'\x00\x00\x00\x01' 
>>> struct.unpack('>i', con) 
(1,) 

을 사용해보십시오.

+0

완벽합니다. 실제로 작동합니다. 하지만 리틀 엔디안은 오른쪽에서부터 읽기 시작했다고 생각했습니다. 어쨌든, 고맙습니다. – joey

+1

리틀 엔디안은 최상위 바이트가 마지막에 오는 "반전 된"것입니다. – yak

+3

@joey :''리틀 엔디안은 진정한 엔디안 중 하나입니다. 바이트 0에서 비트 0-7, 바이트 1에서 비트 8-15 등을 넣습니다. 빅 엔디안은 일반적으로 비트 "0"이 마지막 위치에 오도록 "역순으로"숫자를 쓰는 데서 비롯된 역사적인 실수였습니다. '' –