Python 2:为什么在struct.pack()和struct.unpack()方法中切换了这个字节串顺序?

时间:2014-07-03 16:03:49

标签: python struct hex

在Python 2.7.5中,我有一个十六进制0xbba1,我想以字节串格式更改它。

>>> bytetoint = lambda bytestr: struct.unpack('H', bytestr)[0]
>>> hextobyte = lambda hexnum: struct.pack('H', hexnum)
>>> hextobyte(0xbba1)
'\xa1\xbb'
>>> hex(bytetoint('\xa1\xbb'))
'0xbba1'

为什么第一个字节是' \ xa1'和第二个字节' \ xbb'切换到位了吗?

如何从十六进制中获取正确的字节串,反之亦然?

e.g。 0xbba1 - > ' \ XBB \ XA1' ' \ XBB \ XA1' - > 0xbba1

2 个答案:

答案 0 :(得分:3)

这是一个little-endian/big-endian的事情。你不能真正说切换字节,因为int定义中的任何内容都没有说明代表它的字节的顺序。

您拥有的结果是一个完全可用的little-endian表示。如果你想强制使用人类读者看起来更好的big-endian,你可以用>指定字节顺序:

>>> import struct
>>> struct.pack('>H', 0xbba1)
'\xbb\xa1'
>>> hex(struct.unpack('>H', '\xbb\xa1')[0])
'0xbba1'

答案 1 :(得分:2)

首先阅读endianness,以便了解此问题的来源。在具有little-endian CPU的典型基于x86的计算机上,int(0xbba1)的正确内存表示形式是两个字节a1 bb,按此顺序。

如果您真的想从相反的big-endian顺序解码字节字符串,请参阅this section of the struct docs

bytestring = `\xbb\xa1`
hex( struct.unpack('>H','\xbb\xa1')[0] )