一、函数说明
def decodehex(s): # 转成从左到右,两个为一组的列表 s = [s[i:i+2] for i in range(0, len(s), 2)] # 把十六进制的字符串列表转为整型列表 s = [int(x, 16) for x in s] # 把整型列表转为bytes s = bytes(s) return s
首先,需要明确hex.decodehex函数是Python2中的通用的16进制解码函数。在Python3中,使用bytes.fromhex代替此函数。
该函数的作用是将16进制字符串转换为字节bytes类型。它接受一个字符串类型的参数s,表示需要转换的16进制字符串。
二、函数细节
1.将16进制字符串分组
在函数的第一步,将输入的字符串参数s进行分组。由于16进制字符串是由2个字符组成的,因此我们需要将其从左到右分为长度相等的2个字符一组的多个组。
s = [s[i:i+2] for i in range(0, len(s), 2)]
代码中的range函数表示参数的含义为从0开始,以2个字符一组间隔的方式,截取字符串s,获得长度为2的字符组成的列表。
2.将16进制字符串转换为整型
在第二步,将分好组的16进制字符串,转化为整型,方便后续的操作。
s = [int(x, 16) for x in s]
代码中列表推导式的含义为将每一个s中的元素都转换成整型,其中参数16代表转换为16进制数。
3.将整型列表转换为bytes类型
在第三步,将整型的列表转换为bytes类型。
s = bytes(s)
通过直接把整型列表传给bytes函数,将整型列表转换为bytes类型。最后,整个函数返回我们期待的bytes类型结果。
三、使用示例
1.基本使用
s = '68656c6c6f20776f726c64' result = hex.decodehex(s) print(result)
对于输入的16进制字符串s,我们通过hex.decodehex函数将它解码成字节类型。输出结果如下:
b'hello world'
2.处理网络流数据
hex.decodehex函数可以用于处理网络流数据,比如对于一个Socket程序,通过Socket连接传输数据时,如果有数据是以16进制字符串的方式传输,我们需要将其解码成 bytes类型来处理。具体实现如下:
import socket import hex sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('127.0.0.1', 8080)) while True: data = sock.recv(1024) # 接收数据 if len(data) == 0: # 连接关闭 break s = data.decode('utf8') # 将接收的数据以utf8编码解码 result = hex.decodehex(s) # 将16进制字符串解码成bytes类型 # 对解码后的数据进行其他操作 sock.close()
3.解码HEX编码格式的图片
hex.decodehex函数还可以用于解码HEX编码格式的图片。HEX编码指的是将图片转换成16进制字符串的方式,常常用于网络传输。我们可以通过hex.decodehex将其解码为bytes类型,再用 PIL 库 将其转换为图片格式。
代码如下:
from PIL import Image from io import BytesIO import hex with open('hex_image.txt', 'r') as f: s = f.read() result = hex.decodehex(s) # 转换为图片 img = Image.open(BytesIO(result)) img.show()
四、小结
hex.decodehex函数虽然是在Python2中常用的16进制解码方式,但在Python3中可以使用bytes.fromhex函数替代。我们需要注意在处理网络流数据和解码HEX编码格式的图片时,使用hex.decodehex函数可以让操作更加简便。当然,在功能及效率上,我们需要根据具体的场景进行选择使用哪种方式。