在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
答案 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] )