2012-04-19 9 views
1

b '\ x00 \ x00 \ x00 \ x01'の整数値を取得しようとしています。python struct module - アンパック時の奇数値

私はこの値を '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

結果をリトルエンディアンと解釈しますが、ビッグエンディアンとして解釈する必要があります。お試しください

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

正しいendiannessを使用してください。

+0

パーフェクト、これは確かに動作します。しかし、私はリトルエンディアンが右から読むことを考えました。とにかく、ありがとう。 – joey

+1

リトルエンディアンは、最上位バイトが最後に来る「反転」バイトです。 – yak

+3

@joey: ''リトルエンディアンは真のエンディアンです。これは、ビット0-7をバイト0に、ビット8-15をバイト1に入れます。ビックエンディアンは歴史的な間違いでした。なぜなら、ビット0が最後の場所に来るように、私たちは通常「逆の」数字を書いているからです。 '' –

関連する問題