распаковать функцию в питоне

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

В качестве примера я использую строку формата «I», которая соответствует беззнаковому целому числу (размер, 4 байта).

Согласно документации, функция распаковки примет строку и преобразует ее в список значений на основе строки формата.

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 и сохранить его в порядке с прямым порядком байтов, но он не соответствует приведенному выше выводу.

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


person Neon Flash    schedule 13.07.2013    source источник


Ответы (1)


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

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

1953719668 происходит от: (little endian)

>>> ord('t') + (ord('e') << 8) + (ord('s') << 16) + (ord('t') << 24)
1953719668
person falsetru    schedule 13.07.2013
comment
Спасибо, я проверял код, который использовал I в качестве строки формата для входной строки. Не могли бы вы подробнее рассказать о том, как строка формата применяется к вводу? Я думал, что с прямым порядком байтов это будет выглядеть так: ord(t), ord(s), ord(e), ord(t). старший значащий байт в младший значащий байт. Кроме того, что, если ввод имеет размер более 4 байтов (размер беззнакового целого числа), он не будет применять строку формата к остальным символам? - person Neon Flash; 13.07.2013
comment
@NeonFlash, ord('t') + (ord('e') ‹‹ 8) + (ord('s') ‹‹ 16) + (ord('t') ‹‹ 24) == (ord( 't') ‹‹ 24) + (ord('s') ‹‹ 16) + (ord('e') ‹‹ 8) + ord('t') - person falsetru; 13.07.2013
comment
@NeonFlash, размер формата calcsize() и длина строки должны совпадать. Или это поднимет struct.error. - person falsetru; 13.07.2013
comment
@NeonFlash, если вы хотите распаковать только неподписанные длинные файлы, сделайте что-нибудь вроде struct.unpack('I', input_string[:4]). - person falsetru; 13.07.2013