>>> import binascii, struct
>>> foo_hex = 'b1e92555'
>>> foo_bin = binascii.unhexlify(foo_hex)
>>> int(foo_hex, 16)
2984846677
>>> struct.unpack('i', foo_bin)[0]
1428548017

Почему эти целые числа разные? Какой метод правильный и как можно изменить другой, чтобы он был правильным?

0
Jordan 19 Дек 2012 в 14:27

1 ответ

Лучший ответ

struct интерпретирует значение, используя прямой порядок байтов, тогда как использование unhexlify и int(.., 16) интерпретирует его как целое число без знака с прямым порядком байтов.

Используйте < или >, чтобы указать порядок байтов вашего ввода, и используйте I, чтобы интерпретировать его как знаковое int:

>>> struct.unpack('>I', foo_bin)[0]
2984846677
>>> struct.unpack('<I', foo_bin)[0]
1428548017

См. Раздел Порядок байтов, размер и выравнивание на странице документации struct.

4
Martijn Pieters 19 Дек 2012 в 14:37