Python中不同十六进制类型/表示之间的差异

时间:2012-10-29 14:44:29

标签: python types hex

通过一些Python代码,我注意到十六进制值有许多不同的表示。例如,如果我选择这样的数字:

xx = '\x03\xff'

然后是以下命令(我用来将小端转换为大端的版本)

yy = hex(struct.unpack('>H', xx)[0])

将返回:

'0x3ff'

然而,这个命令

zz = xx.encode('hex')

将返回:

'03ff'

最后,只打印出值将返回

'\x03\xff'

从它的外观来看,有三种不同类型的十六进制。

  1. '\xFF'
  2. '0xFF'
  3. 'FF'
  4. 有什么区别?

    奖励积分 如果有人可以建议更好的方法将小端转换为大端数。 yy的上述方法对于大于两个字节的数字不够笨拙地工作,并且我正在使用一些16字节长的十六进制字符串(包括不对应的值)一个ascii /整数值)

2 个答案:

答案 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之间的多个字符。