字节对象中双反斜杠转单反斜杠时出现异常的问题排查
问题原因
你用unicode_escape解码再raw_unicode_escape编码的方式,会把对应可打印ASCII字符的转义序列(比如\x3d对应=、\x5b对应[)直接解析成可见字符,而非保留原始字节值。这就是开头\x3d\x5b变成=[的原因——unicode_escape解码时将这类转义序列转换为对应字符,后续编码仅把字符转成ASCII字节,并非你期望的原始十六进制字节。
解决方案
以下两种方法可稳定将含双反斜杠的十六进制转义序列转换为原始字节:
方法1:正则提取十六进制字符后转字节
直接从字符串中提取所有\xXX格式的十六进制部分,拼接成纯十六进制字符串后用bytes.fromhex()转换:
import re string1 = '\\x3d\\x5b\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00' # 提取\x后的两位十六进制字符,拼接成纯十六进制串 hex_content = re.sub(r'\\x([0-9a-fA-F]{2})', r'\1', string1) bytes_single_back = bytes.fromhex(hex_content) print(bytes_single_back) # 输出:b'\x3d\x5b\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00'
方法2:用ast.literal_eval解析字节字面量
把字符串包装成合法的bytes字面量格式(添加b''),用ast.literal_eval安全解析:
import ast string1 = '\\x3d\\x5b\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00' # 包装为b'...'形式的字节字面量字符串 byte_literal = f"b'{string1}'" bytes_single_back = ast.literal_eval(byte_literal) print(bytes_single_back) # 输出:b'\x3d\x5b\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00'
这两种方法均可处理所有\xXX格式的转义序列,无论对应字符是否可打印,都能得到预期的原始字节对象。
内容的提问来源于stack exchange,提问作者Hypherix
相关产品推荐
相关产品推荐

