Python 字节/十六进制到人类可读值?

Python 字节/十六进制到人类可读值?,python,Python,我想学习包解码器处理使用。在该站点上,我看到了以下示例代码: >>> 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' >>>

我想学习包解码器处理使用。在该站点上,我看到了以下示例代码:

>>> 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”是什么意思?有没有可能将这样的字符串转换成更容易让人阅读的内容?

您得到的值是您正在处理的数据包的IP头中的位的十六进制字符串表示形式

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


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

要获得作为整数的值,可以执行以下操作:

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

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

更多人类可读的
'\x01\x02\x03\x04'
形式将是
'1.2.3.4'

您可以像这样将字符串的各个部分转换为十进制

>>> int('0x01', 16)
1
>>> int('0x13', 16)
19
“\x01\x02\x03\x04”和“\x05\x06\x07\x08”是源和目标IP地址。您可以使用socket.inet\u ntoa将它们转换为更易于阅读的格式

>>> socket.inet_ntoa('\x01\x02\x03\x04')
'1.2.3.4'

您希望输出是什么?换句话说,你所说的“更具可读性”是什么意思?对于一个二进制字符串(是的,它已经是一个字符串),这与它的可读性差不多。永远不要为一个问题道歉。
>>> socket.inet_ntoa('\x01\x02\x03\x04')
'1.2.3.4'