Python从socket转换的十六进制为ASCII
我相信这个问题有个简单的答案,但我总是找不到合适的关键词在谷歌上搜索到答案。我现在从一个套接字(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)