在 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'
所以我写了这个小套接字程序来发送一个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'