2013-07-13 3 views
4

Я пытаюсь понять функцию распаковки в Python и как она использует строку формата.Функция распаковки в python

Я использую строку формата «I», которая соответствует примеру unsigned int (size, 4 bytes).

В соответствии с документацией функция unpack примет строку и преобразует ее в список значений на основе строки формата.

http://docs.python.org/2/library/struct.html

Таким образом, я использовал значение входного сигнала в виде строки, «тест», и здесь есть выход:

>>> import struct 
>>> input="test" 
>>> l = struct.unpack("I", input)[0] 
>>> print l 
1953719668 

Я пытаюсь понять, как выходное значение было получено от входа ,

>>> from struct import * 
>>> calcsize('I') 
4 

Размер «I» - 4 байт. строка, «тест» имеет 4 символа, который равен 4 байтам. Я попытался преобразовать каждый символ в соответствующее значение Hex ASCII и сохранить его в маленьком концевом порядке, но он не соответствует выходу выше.

Любая помощь будет оценена по достоинству.

ответ

5

Используйте 4s, если вы хотите распаковать строку как есть.

>>> struct.unpack('4s', 'test')[0] 
'test' 

1953719668 получают путем: (маленький обратный порядок байт)

>>> ord('t') + (ord('e') << 8) + (ord('s') << 16) + (ord('t') << 24) 
1953719668 
+0

спасибо, я проверял код, который использовал «Я» в качестве формата строки для ввода строки. Не могли бы вы подробнее рассказать о том, как строка формата применяется к вводу? Я подумал, что в конце концов это будет выглядеть так: ord (t), ord (s), ord (e), ord (t). наиболее значимый байт до наименее значимого байта. Кроме того, что, если вход имеет размер больше 4 байтов (размер unsigned int), он не будет применять строку формата к оставшимся символам? –

+0

@NeonFlash, ord ('t') + (ord ('e') << 8) + (ord ('s') << 16) + (ord ('t') << 24) == (ord ('t') << 24) + (ord ('s') << 16) + (ord ('e') << 8) + ord ('t') – falsetru

+0

@NeonFlash, размер вычисления calcseize (), а длина строки должна быть одинаковой. Или это вызовет 'struct.error'. – falsetru