Python中如何仅将UDP响应中的十六进制值转换为十进制(保留字符串内容)
我来帮你解决这个问题——你需要的是逐个处理UDP响应里的每个字节,把非可打印的十六进制字节转成十进制数字,同时保留原本的可打印字符串内容。下面是具体的实现思路和代码:
解决思路
核心逻辑是逐个遍历响应中的每个字节:
- 对于可打印的ASCII字符(比如字母、数字、常规符号),直接保留为原字符
- 对于非可打印的十六进制字节(比如
\xff、\x11这类),将其转换为对应的十进制数字字符串
这种方式不会像decode方法那样丢失非可打印字节,同时能完整保留原本的可读内容。
代码实现
import string def parse_udp_response(raw_bytes): processed_parts = [] for byte in raw_bytes: # 判断是否为可打印ASCII字符(排除空字节\x00,若需保留可去掉and byte !=0) if chr(byte) in string.printable and byte != 0: processed_parts.append(chr(byte)) else: # 将十六进制字节转换为十进制数字字符串 processed_parts.append(str(byte)) return ''.join(processed_parts) # 用你的UDP响应数据测试 raw_response = b'\xff\xff\xff\xffI\x11server banner\x00map\x00game\x00Counter-Strike: Global Offensive\x00\xda\x02\x00\x10\x00dl\x01\x011.38.2.2\x00\xa1\x87iempty,secure\x00\xda\x02\x00\x00\x00\x00\x00\x00' result = parse_udp_response(raw_response) print(result)
代码说明
- 遍历字节:通过
for byte in raw_bytes逐个访问响应中的每个字节(注意:每个字节本身就是十进制数值,比如\x11对应的十进制就是17) - 识别可打印字符:用
string.printable来匹配所有可打印的ASCII字符(包括空格、数字、字母、常用符号),同时排除空字节\x00(如果你的场景需要保留空字节,只需去掉and byte !=0,空字节会被转为字符串"0") - 转换非可打印字节:对于非可打印的字节,直接用
str(byte)将其十进制数值转为字符串,比如\xff会变成"255",\x11会变成"17" - 拼接结果:把所有处理后的片段拼接成最终字符串,得到你需要的混合内容
效果示例
对于你提供的响应数据,处理后会得到类似这样的内容:
255255255255I17server banner0map0game0Counter-Strike: Global Offensive021820160dl111.38.2.20161135iempty,secure021820000000
(注:其中的数字就是原本十六进制字节对应的十进制值,可打印字符串完全保留)
内容的提问来源于stack exchange,提问作者CureofQuarantine
相关产品推荐
相关产品推荐

