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

5 投票
4 回答
22207 浏览
提问于 2025-04-17 10:31

我想学习如何使用 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')))

我对一些使用十六进制的行感到困惑,比如:

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

像 "\x01\x02\x03\x04" 和 "\x05\x06\x07\x08" 这些是什么意思呢?有没有办法把这些字符串转换成更容易理解的形式?

4 个回答

1

更容易理解的形式是 '1.2.3.4',而不是 '\x01\x02\x03\x04'

你可以像下面这样把字符串的各个部分转换成十进制数:

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

你得到的这些值是以十六进制字符串的形式表示的,代表了你正在处理的数据包中的IP头部的位。

大多数情况下,你可以直接使用这些值,但如果你需要解码它们,可以使用struct模块(这个模块很方便,因为它会自动处理那些超过一个字节的字段的字节顺序),或者在简单的情况下,使用ord这个内置函数:

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

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

如果你想把这些值转换成整数,可以这样做:

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

不过我不太确定这是不是你真正想要的。请更清楚地描述一下你的问题。

撰写回答