python十六进制运算_十六进制字符串hexstr的计算

在面向比较底层的编程时,界面和接口常常需要显示十六进制字符串(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 "", line 1, in

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 --

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值