Python中不同十六进制类型/表示的区别

2024-04-25 22:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

xx = '\x03\xff'

然后是下面的命令(我正在使用它将little endian转换为big endian)

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

将返回:

'0x3ff'

但是,这个命令

zz = xx.encode('hex')

将返回:

'03ff'

最后,只打印出值将返回

'\x03\xff'

从外观上看,有三种不同的十六进制。

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

有什么区别?

如果有人能提出一种更好的方法,将一个小的尾数转换成一个大的尾数,就可以获得额外的积分。上面的yy方法对大于两个字节的数字不起作用,我正在处理一些16字节长的十六进制字符串(包括与ascii/整数值不对应的值)


Tags: 方法代码命令字节数字structhexxx
2条回答

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

>>> 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)与整数数据的关系相同;您已经更改了类型,离更改字节顺序的目标还很远。

将二进制信息从小结尾改为大结尾需要知道该信息的大小。如果只有短整数,则需要每两个字节左右翻转一次,但如果有普通(长)整数,则每个值有4个字节,并且需要反转每个4个字节。

我认为,使用struct模块是一种很好的方法,因为您必须指定值类型。下面将xx解释为一个大端无符号短整型,然后将其打包回一个二进制表示形式,即一个小端无符号短整型:

>>> import struct
>>> xx = '\x03\xff'
>>> struct.pack('<H', *struct.unpack('>H', xx))
'\xff\x03'

“\xFF”表示包含ASCII代码为255的字符的字符串。

例如: print '\x41'给出“A”(因为这是带有ASCII代码41的字符)

xx.encode('hex')hex(struct.unpack('>H', xx)[0])只是给出了字符串xx包含的ASCII代码的十六进制表示。 这意味着生成的字符串包含a到f或0到9之间的多个字符。

相关问题 更多 >