2012-04-19 2 views
1

Я пытаюсь получить целочисленное значение для b '\ x00 \ x00 \ x00 \ x01', которое должно быть 1, я предполагаю.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

Вы интерпретируете результат как маленький endian, но вы должны интерпретировать его как большой endian. Задайте вопрос

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

использовать правильный endianness.

+0

Отлично, это действительно работает. Но я подумал, что малое чтение начинается справа. Во всяком случае, большое спасибо. – joey

+1

Маленький endian - это «перевернутый», где последний байт приходит последним. – yak

+3

@joey: '' Маленький кончик - это Единая истинная сущность. Он помещает бит 0-7 в байт 0, бит 8-15 в байт 1 и так далее. Большой эндиан был исторической ошибкой, вызванной тем, что мы обычно пишем цифры «в обратном порядке», так что бит 0 приходит на последнем месте. '' –

Смежные вопросы