bytes / hex到人类可读的值?

时间:2012-01-18 11:38:28

标签: python

我想学习dpkt的数据包解码器处理。在网站上,我看到了以下示例代码:

>>> from dpkt.ip import IP
>>> from dpkt.icmp import ICMP
>>> ip = IP(src='\x01\x02\x03\x04', dst='\x05\x06\x07\x08', p=1)
>>> ip.v4
>>> ip.src
'\x01\x02\x03\x04'
>>> ip.data
''
>>> 
>>> icmp = ICMP(type=8, data=ICMP.Echo(id=123, seq=1, data='foobar'))
>>> icmp
ICMP(type=8, data=Echo(id=123, seq=1, data='foobar'))
>>> len(icmp)
14
>>> ip.data = icmp
>>> ip.len += len(ip.data)
>>> ip
IP(src='\x01\x02\x03\x04', dst='\x05\x06\x07\x08', len=34, p=1, data=ICMP(type=8, data=Echo(id=123, seq=1, data='foobar')))
>>> pkt = str(ip)
>>> pkt
'E\x00\x00"\x00\x00\x00\x00@\x01j\xc8\x01\x02\x03\x04\x05\x06\x07\x08\x08\x00\xc0?\x00{\x00\x01foobar'
>>> IP(pkt)
IP(src='\x01\x02\x03\x04', dst='\x05\x06\x07\x08', sum=27336, len=34, p=1, data=ICMP(sum=49215, type=8, data=Echo(id=123, seq=1, data='foobar')))

我对使用hexa的行感到困惑,例如:

ip = IP(src='\x01\x02\x03\x04', dst='\x05\x06\x07\x08', p=1)

“\ x01 \ x02 \ x03 \ x04”和“\ x05 \ x06 \ x07 \ x08”是什么意思?是否可以将这些字符串转换为人类可读的字符?

4 个答案:

答案 0 :(得分:3)

您获得的值是来自您正在使用的数据包的IP头中存在的位的十六进制字符串表示。

大多数情况下,您应该能够直接处理这些值,但是如果您需要解码它们,您可以使用struct模块(这很好,因为它会处理这些字段的字节顺序宽度超过一个字节)或甚至,在简单的情况下,ord内置:

>>> src = '\x01\x02\x03\x04'
>>> '.'.join(str(ord(c)) for c in src)
'1.2.3.4'

答案 1 :(得分:2)

src='\x01\x02\x03\x04'中,src是一个字节序列,表示为字符串。它包含字节值1234。这些对应于ASCII字符集中的不可打印字符,这就是Python使用十六进制转义序列显示它们的原因。

要以整数形式获取值,您可以执行以下操作:

>>> [ord(c) for c in src]
[1, 2, 3, 4]

虽然我不确定这是你真正想要的。请更清楚地定义您的问题。

答案 2 :(得分:1)

'\x01\x02\x03\x04'的更易读的形式是'1.2.3.4'

您可以将字符串的部分转换为十进制,如此

>>> int('0x01', 16)
1
>>> int('0x13', 16)
19

答案 3 :(得分:0)

“\ x01 \ x02 \ x03 \ x04”和“\ x05 \ x06 \ x07 \ x08”是源和目标IP地址。您可以使用socket.inet_ntoa

将它们转换为更易读的
>>> socket.inet_ntoa('\x01\x02\x03\x04')
'1.2.3.4'