在 python 中将十六进制转换为 decimal/string

Convert hex to decimal/string in python

所以我写了这个小套接字程序来发送一个udp数据包并接收响应

    sock.sendto(data, (MCAST_GRP, MCAST_PORT))
    msgFromServer = sock.recvfrom(1024)
    banner=msgFromServer[0]
    print(msgFromServer[0])
    #name = msgFromServer[0].decode('ascii', 'ignore')
    #print(name)

响应是

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'

现在我想将所有十六进制值转换为十进制, 我试过解码;但后来我最终失去了所有的十六进制值。

在我的案例中如何将所有十六进制值转换为十进制值

example: \x13 = 19

编辑:我想重复我的问题的更好方法是

如何仅将给定响应中的十六进制值转换为十进制值

您可以先使用 bytes.hex method and then cast it into an integer with the appropriate base with int(x, base)

将字节表示形式转换为十六进制
>>> b'\x13'.hex()
'13'
>>> int(b'\x13'.hex(), 16)
19

假设 v 包含响应,你要的是

[int(i) for i in v]

我怀疑这不是你想要的,这是我从问题中读到的

这里有两个问题:

  • 处理 non-ASCII 字节
  • 处理 \xhh 序列,这些序列是 Python 字符串中的合法字符

我们可以混合使用正则表达式和字符串方法。

首先,使用反斜杠替换错误处理程序将字节解码为 ASCII,以避免丢失 non-ASCII 字节。

>>> import re
>>>
>>> decoded = msgFromServer[0].decode('ascii', errors='backslashreplace')
>>> decoded
'\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'

接下来,使用正则表达式将 non-ASCII '\xhh' 序列替换为其数字等价物:

>>> temp = re.sub(r'\x([a-fA-F0-9]{2})', lambda m: str(int(m.group(1), 16)), decoded)
>>> temp
'255255255255I\x11server banner\x00map\x00game\x00Counter-Strike: Global Offensive\x00218\x02\x00\x10\x00dl\x01\x011.38.2.2\x00161135iempty,secure\x00218\x02\x00\x00\x00\x00\x00\x00'

最后,使用 str.translate:

\xhh 转义序列映射到它们的十进制值
>>> tt = str.maketrans({x: str(x) for x in range(32)})
>>> final = temp.translate(tt)
>>> final
'255255255255I17server banner0map0game0Counter-Strike: Global Offensive021820160dl111.38.2.20161135iempty,secure02182000000'