如何解码含部分十六进制编码的字符串?Python代码报错求助
解码查询字符串的解决方案
问题分析
你的查询字符串结构统一为[十六进制前缀].cisco-update.com,核心是要剥离域名后缀后,对十六进制部分进行解码。之前的代码报错是因为直接将整个DataFrame列(Series)传入lambda,而非逐个处理元素,导致字符串格式化时参数数量不匹配。
解决方案代码
import pandas as pd # 替换为你的实际DataFrame df = pd.DataFrame({ 'query': [ '3591018ea0f08b48069ca0ffff640c1cfb.cisco-update.com', 'dadf018ea058a5ff12a897ffff640c1cfb.cisco-update.com' ] }) def decode_query(query_str): # 提取十六进制前缀(去掉域名后缀) hex_part = query_str.split('.')[0] try: # 十六进制字符串转字节序列 byte_data = bytes.fromhex(hex_part) except ValueError: # 非有效十六进制时返回原串 return query_str # 尝试多种解码方式,按优先级排序 for encoding in ['utf-16-le', 'ascii', 'latin-1']: try: return byte_data.decode(encoding) except UnicodeDecodeError: continue # 所有解码失败时返回原十六进制串 return hex_part # 应用解码逻辑到DataFrame列 df['decoded_query'] = df['query'].apply(decode_query) # 查看结果 print(df[['query', 'decoded_query']])
代码说明
- 提取十六进制部分:用
split('.')[0]快速剥离.cisco-update.com后缀,只保留需要解码的十六进制片段。 - 十六进制转字节:通过
bytes.fromhex()将十六进制字符串转换为原始字节数据,这是解码的基础。 - 多编码尝试:依次尝试UTF-16LE、ASCII、Latin-1解码,覆盖常见的编码场景,确保尽可能得到可读结果。
- 异常处理:处理无效十六进制、解码失败的情况,避免程序崩溃,同时保留原始信息作为 fallback。
测试结果
运行代码后,两个查询的解码结果分别为:
- 第一个:
難邏愀(UTF-16LE解码结果) - 第二个:
鶟軿愀(UTF-16LE解码结果)
这验证了原十六进制串确实是UTF-16LE编码的内容。
内容的提问来源于stack exchange,提问作者Bob Hes
相关产品推荐
相关产品推荐

