Python从socket转换的十六进制为ASCII

1 投票
4 回答
6706 浏览
提问于 2025-04-18 13:20

我相信这个问题有个简单的答案,但我总是找不到合适的关键词在谷歌上搜索到答案。我现在从一个套接字(socket)中获取到了一些原始数据包。

pkt=sock.recv(2048)
'\x00\x00\x12\x00.H\x00\x00\x00\x02l\t\xa0\x00\xb3\x01\x00\x00'

上面的内容是radiotap格式的,你可以看到,有几个字节被转换成了ASCII字符,比如'.'、'H'和't'。我该怎么做才能让它显示成十六进制的值呢?

'\x00\x00\x12\x00\x2e\x48 ...'

4 个回答

0

我觉得这些就是你得到的数字。注意:

In [24]: aaa =  '\x00\x00\x12\x00\x2E\x48\x00\x02'

In [25]: aaa
Out[25]: '\x00\x00\x12\x00.H\x00\x02'
2

我通常在以十六进制形式显示字符串时,会使用类似下面的代码:

>>> def tohexstr(s):
...     return ''.join('%02x' % ord(c) for c in s)
...
>>> tohexstr('1 2 3 a b c')
'3120322033206120622063'

如果你经常这样做,可能会想要创建一个新的类,继承自 str,并重写 __repr__ 方法:

>>> class hexstr(str):
...     def __repr__(self):
...         return ''.join('%02x' % ord(c) for c in self)
...
>>> hexstr('\x01\x02\x03\x30\x31abc')
0102033031616263

可以尝试不同的字节分隔符,看看哪个最适合你,比如:

>>> s = 'abc123'
>>> print ''.join('\\x%02x' % ord(c) for c in s)
\x61\x62\x63\x31\x32\x33
>>> print '-'.join('%02x' % ord(c) for c in s)
61-62-63-31-32-33
2

因为recv()这个函数会返回一个字符串,你可以这样做:

pkt=sock.recv(2048)
# pkt = "1234567890" # uncomment to test

for i in pkt:
    print hex(ord(i))
2

你看到的只是一个可读的字符串表示。实际上,\x00 是一个字节,叫做空字节。H 也是一个字节,它的值是 0x48(就像你之前写的那样)。

如果你立刻打印这个字符串,你只会看到可以打印的字符;控制字符会被执行。

如果你想要完整的十六进制表示,你可能需要这样做:

print pkt.encode('hex') # at least under Py2
print " ".join("%02x" % ord(i) for i in pkt)
print "\x" + "\x".join("%02x" % ord(i) for i in pkt)

撰写回答