Python3中实现bytes转特定十六进制格式字符串的方法求助
解决方案
1. 将bytes对象转换为目标字符串
在Python3中,要把b'\xaa\xbb\xcc'转成长度为3的字符串'\xaa\xbb\xcc',可以用latin-1编码解码。因为latin-1(ISO-8859-1)是单字节编码,每个字节值(0-255)对应唯一的Unicode码点,完全匹配Python2中str的字节映射逻辑:
# 从bytes转目标字符串 byte_data = b'\xaa\xbb\xcc' target_str = byte_data.decode('latin-1') print(len(target_str)) # 输出3 print(repr(target_str)) # 输出 '\xaa\xbb\xcc'
2. 直接从十六进制字符串转换为目标字符串
如果要从'aabbcc'直接得到'\xaa\xbb\xcc',有两种简洁方式:
方法一:先转bytes再解码
先通过binascii.a2b_hex()得到bytes,再用latin-1解码:
import binascii hex_str = 'aabbcc' target_str = binascii.a2b_hex(hex_str).decode('latin-1')
方法二:逐段解析十六进制并构造字符串
直接遍历十六进制字符串,每两位转成对应字符:
hex_str = 'aabbcc' target_str = ''.join( chr(int(hex_str[i:i+2], 16)) for i in range(0, len(hex_str), 2) )
为什么这个方法可行?
Python2的str本质是字节序列,每个字节直接对应一个字符;而Python3的str是Unicode字符串。latin-1编码的映射规则是字节值与Unicode码点一一对应(0x00→U+0000,0xFF→U+00FF),所以解码后得到的字符串长度和原bytes长度完全一致,每个字符的底层数值也和原字节完全匹配,完美适配原库的Python2数据模型。
之前尝试的hex()、binascii.hexlify()是将bytes转换为十六进制文本字符串(比如b'\xaa'转成'aa'),方向和需求相反,所以无法得到目标结果。
内容的提问来源于stack exchange,提问作者Robby
相关产品推荐
相关产品推荐

