十六进制字符串hexstr的计算

2019年12月23日 / 303次阅读 / Last Modified 2020年5月14日
字符串数值计算

在面向比较底层的编程时,界面和接口常常需要显示十六进制字符串(hexstr)。hexstr只包含0-9a-f的字符,本文汇总一些能够得到hexstr的计算方法。

hex函数

hex函数是builtin的,随手就能拿来使用。不过有个问题需要注意,hex函数对于负数的显示有点拧巴:

>>> hex(123)
'0x7b'
>>> hex(-123)
'-0x7b'
>>> hex(-123 & 0xFF)
'0x85'
>>> hex(123)[2:]
'7b'

通过与(&)运算,可以得到负数的hexstr,不过需要自己去判断这个负数所占用的字节数。hex函数只能接收int型数据。

bytes.hex函数

还可以使用int型的to_bytes函数,不过跟hex函数一样,这也需要自己填入字节数,只是用这个方法,可以将合适的字节数试出来:

>>> (-9).to_bytes(1, 'big', signed=True)
b'\xf7'
>>> (-99).to_bytes(1, 'big', signed=True)
b'\x9d'
>>> (-999).to_bytes(1, 'big', signed=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: int too big to convert
>>> (-999).to_bytes(2, 'big', signed=True)
b'\xfc\x19'

捕捉OverflowError异常可以试出所需要的字节数。

to_bytes得到的是bytes对象,然后我们可以用bytes对象的hex函数,直接得到hexstr:

>>> b'abcde'.hex()
'6162636465'
>>> (-999).to_bytes(2, 'big', signed=True).hex()
'fc19'

binascii.hexlify函数

binascii模块也在python的标准库中,hexlify就是十六进制化的意思。据python官方说,binascii模块比较底层,但是速度很快,效果跟bytes.hex一样

>>> binascii.hexlify(b'abcde').decode()
'6162636465'
>>> binascii.hexlify(b'\xFF\xEE\x01\xD9').decode()
'ffee01d9'

如果是字符串,可以使用这个函数,弥补了hex函数只能对int型数据计算的遗憾。如果不是ascii字符串,而是unicode字符串呢?同样,用encode()函数先转换成byte对象,然后调用此函数。

>>> a = '麦新杰的www.pynote.net'
>>> a.encode()
b'\xe9\xba\xa6\xe6\x96\xb0\xe6\x9d\xb0\xe7\x9a\x84www.pynote.net'
>>> binascii.hexlify(a.encode())
b'e9baa6e696b0e69db0e79a847777772e70796e6f74652e6e6574'

计算hexstr,在python中基本上就这些标准的方法,当然自己写转换函数也是可以的。

-- EOF --

本文链接:https://www.pynote.net/archives/1628

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top