套接字中的Python十六进制转换为ascii

时间:2014-07-14 23:44:23

标签: python sockets

我确信这有一个简单的答案,问题是在谷歌中正确地表达它以获得我似乎可以做的答案。我从套接字获取一个原始数据包。

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 :(得分:2)

由于recv()返回一个字符串,你可以这样做:

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

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

答案 1 :(得分: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 :(得分: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)

答案 3 :(得分:0)

我认为这些是你得到的数字。注意:

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

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