任何使用\x
都是字符串转义码,恰好使用十六进制表示法;其他转义码包括\n
换行符、\'
文字引号等。python 字符串是一个字节序列,您可以使用这些字符指定 ASCII 可打印范围之外的文字值。当 Python 在解释器中回显一个字符串值,或者你打印repr()
一个字符串调用的结果时,Python 将使用这种转义来表示任何不能打印为 ASCII 字符的字节:
>>> chr(65)
'A'
>>> chr(11)
'\x0b'
该hex()
函数返回一个非常具体的字符串表示,.encode('hex')
不同之处在于前者包含0x
前缀。还有两种方法可以产生这样的字符串表示;使用'%x'
and'%X'
字符串格式化程序,它们使用小写或大写字母表示。
>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'
尽管这些都是字符串表示(一系列 ASCII 字符),并且与原始数据的关系与str(number)
整数数据的关系相同;您已经更改了类型,并且离更改字节顺序的目标更远了。
将一条二进制信息从小端转换为大端需要您知道该信息的大小。如果你只有短整数,那么你需要每两个字节翻转一次,但如果你有普通(长)整数,那么每个值有 4 个字节,你需要每 4 个字节反转。
我认为使用struct
模块是一种很好的方法,因为您必须指定值类型。以下将解释xx
为 big-endian unsigned short int,然后将其打包回二进制表示为 little-endian unsigned short int:
>>> import struct
>>> xx = '\x03\xff'
>>> struct.pack('<H', *struct.unpack('>H', xx))
'\xff\x03'