You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
代码说明
  1. 遍历字节:通过for byte in raw_bytes逐个访问响应中的每个字节(注意:每个字节本身就是十进制数值,比如\x11对应的十进制就是17)
  2. 识别可打印字符:用string.printable来匹配所有可打印的ASCII字符(包括空格、数字、字母、常用符号),同时排除空字节\x00(如果你的场景需要保留空字节,只需去掉and byte !=0,空字节会被转为字符串"0")
  3. 转换非可打印字节:对于非可打印的字节,直接用str(byte)将其十进制数值转为字符串,比如\xff会变成"255",\x11会变成"17"
  4. 拼接结果:把所有处理后的片段拼接成最终字符串,得到你需要的混合内容
效果示例

对于你提供的响应数据,处理后会得到类似这样的内容:

255255255255I17server banner0map0game0Counter-Strike: Global Offensive021820160dl111.38.2.20161135iempty,secure021820000000

(注:其中的数字就是原本十六进制字节对应的十进制值,可打印字符串完全保留)

内容的提问来源于stack exchange,提问作者CureofQuarantine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:23:16