本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第6章,第6.9节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
6.9 编码和解码十六进制数字
6.9.1 问题
我们需要将十六进制数组成的字符串解码为字节流,或者将字节流编码为十六进制数。
6.9.2 解决方案
如果需要编码或解码由十六进制数组成的原始字符串,可以使用binascii模块。示例如下:
>>> # Initial byte string
>>> s = b'hello'
>>> # Encode as hex
>>> import binascii
>>> h = binascii.b2a_hex(s)
>>> h
b'68656c6c6f'
>>> # Decode back to bytes
>>> binascii.a2b_hex(h)
b'hello'
>>>
同样的功能也可以在base64模块中找到。示例如下:
>>> import base64
>>> h = base64.b16encode(s)
>>> h
b'68656C6C6F'
>>> base64.b16decode(h)
b'hello'
>>>
6.9.3 讨论
对于大部分情况而言,采用上面给出的函数对十六进制数进行转换都是简单直接的。这两种技术的主要区别在于大写转换。base64.b16decode()和base64.b16encode()函数只能对大写形式的十六进制数进行操作,而binascii模块能够处理任意一种情况。
此外还需要重点提到的是编码函数产生的输出总是字节串。如果要将其强制转换为Unicode输出,可能需要增加一些额外的解码操作。示例如下:
>>> h = base64.b16encode(s)
>>> print(h)
b'68656C6C6F'
>>> print(h.decode('ascii'))
68656C6C6F
>>>
当解码十六进制数时,b16decode()和a2b_hex()函数可接受字节串或Unicode字符串作为输入。但是,这些字符串中必须只能包含ASCII编码的十六进制数字。