You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scapy提取数据包原始字节转纯十六进制的方法咨询

解决Scapy原始字节转纯十六进制&chexdump截断的问题

我来帮你搞定这两个Scapy使用中的小问题,都是大家常遇到的情况:

一、获取纯十六进制,避免ASCII字符干扰

你看到的b"\x17\x03\x03\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xd6tK\xf8\xc1itQ\xa0;"这种格式,是Python对bytes对象的默认显示方式——它会把可打印的ASCII字符直接显示出来,确实会干扰解析。有两个简单的解决方法:

方法1:用Python原生的hex()方法

Scapy提取的原始字节本质就是Python的bytes对象,直接调用它的hex()方法就能得到纯十六进制字符串,完全不会混入ASCII:

# 假设你已经拿到了原始字节数据
raw_bytes = b"\x17\x03\x03\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xd6tK\xf8\xc1itQ\xa0;"
pure_hex = raw_bytes.hex()
print(pure_hex)

输出会是:17030300a300000000000000d6744bf8c1697451a03b,完美符合你的需求。

方法2:Scapy内置的bytes2hex()函数

如果你更习惯用Scapy自带的工具,也可以用bytes2hex()函数,效果完全一样:

from scapy.utils import bytes2hex

pure_hex = bytes2hex(raw_bytes)
print(pure_hex)

二、解决chexdump()只输出部分内容的问题

chexdump()默认会对较长的数据包做截断处理,这是Scapy为了避免输出刷屏的默认设置。要显示完整内容,有两种办法:

方法1:调用时指定length参数

直接把length设置为数据包的总长度就行:

chexdump(raw_bytes, length=len(raw_bytes))
# 如果是对整个Scapy数据包对象操作:
# packet = sniff(count=1)[0]
# chexdump(packet, length=len(packet))

方法2:全局关闭输出截断

要是你不想每次都加参数,可以修改Scapy的全局配置,让所有输出都不截断:

from scapy.all import conf

conf.mesg_trunc = 0  # 0表示不截断任何内容

之后再调用chexdump()就会默认显示完整的数据包内容了。


内容的提问来源于stack exchange,提问作者Paul3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:21:24