通过一些Python代码,我注意到十六进制值有许多不同的表示。例如,如果我选择这样的数字:
xx = '\x03\xff'
然后是以下命令(我用来将小端转换为大端的版本)
yy = hex(struct.unpack('>H', xx)[0])
将返回:
'0x3ff'
然而,这个命令
zz = xx.encode('hex')
将返回:
'03ff'
最后,只打印出值将返回
'\x03\xff'
从它的外观来看,有三种不同类型的十六进制。
'\xFF'
'0xFF'
'FF'
有什么区别?
奖励积分 如果有人可以建议更好的方法将小端转换为大端数。 yy
的上述方法对于大于两个字节的数字不够笨拙地工作,并且我正在使用一些16字节长的十六进制字符串(包括不对应的值)一个ascii /整数值)
答案 0 :(得分:8)
使用\x
的任何内容都是字符串转义码,它恰好使用十六进制表示法;其他转义码包括换行符\n
,文字引号\'
等.python字符串是一个字节序列,您可以使用这些字符指定ASCII可打印范围之外的文字值。当Python在解释器中回显一个字符串值,或者在字符串上打印repr()
调用的结果时,Python将使用这样的转义来表示任何无法打印为ASCII字符的字节:< / p>
>>> chr(65)
'A'
>>> chr(11)
'\x0b'
hex()
函数返回一个非常具体的字符串表示形式,.encode('hex')
也是如此,区别在于前者包含0x
前缀。还有两种方法可以产生这种字符串表示;使用'%x'
和'%X'
字符串格式化程序,使用小写或大写字母表示。
>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'
这些都是字符串表示(一系列ASCII字符),并且与原始数据具有相同的关系,因为str(number)
是整数数据;您已经更改了类型,并且远离了更改字节顺序的目标。
将一条二进制信息从little-endian更改为big-endian要求您知道该信息的 size 。如果你只有短整数,那么你需要翻转每两个字节,但如果你有正常(长)整数,那么每个值有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'
答案 1 :(得分:2)
'\ xFF'表示包含ASCII码255字符的字符串。
例如为:
print '\x41'
给出'A'(因为这是ASCII码41的字符)
xx.encode('hex')
和hex(struct.unpack('>H', xx)[0])
只是给出字符串xx包含的ASCII码的人类可读十六进制表示。
这意味着结果字符串包含a和f或0到9之间的多个字符。