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