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

ste*_*fin 20 python hex types

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

xx = '\x03\xff'
Run Code Online (Sandbox Code Playgroud)

然后是以下命令(我用它来将little endian转换为big endian的版本)

yy = hex(struct.unpack('>H', xx)[0])
Run Code Online (Sandbox Code Playgroud)

将返回:

'0x3ff'
Run Code Online (Sandbox Code Playgroud)

但是,这个命令

zz = xx.encode('hex')
Run Code Online (Sandbox Code Playgroud)

将返回:

'03ff'
Run Code Online (Sandbox Code Playgroud)

最后,只打印出值将返回此值

'\x03\xff'
Run Code Online (Sandbox Code Playgroud)

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

  1. '\xFF'
  2. '0xFF'
  3. 'FF'

有什么不同?

如果有人可以建议更好的方法将小端转换为大端数,则可以获得奖励积分.上面的方法yy不适用于大于两个字节的数字,而且我正在使用一些16字节长的十六进制字符串(包括与ascii/integer值不对应的值)

Mar*_*ers 9

任何使用\x都是一个字符串转义码,恰好使用十六进制表示法; 其他转义码包括\n换行符,\'文字引号等.python字符串是一个字节序列,您可以使用这些字符指定ASCII可打印范围之外的文字值.当Python在解释器中回显一个字符串值,或者repr()在字符串上打印调用结果时,Python将使用这样的转义来表示任何无法打印为ASCII字符的字节:

>>> chr(65)
'A'
>>> chr(11)
'\x0b'
Run Code Online (Sandbox Code Playgroud)

hex()函数返回一个非常具体的字符串表示,.encode('hex')区别在于前者包含0x前缀.还有两种方法可以产生这样的字符串表示; 使用'%x''%X'字符串格式化程序,使用小写或大写字母表示.

>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'
Run Code Online (Sandbox Code Playgroud)

这些都是字符串表示(一系列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'
Run Code Online (Sandbox Code Playgroud)