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

如何将Scapy捕获的Ether帧转换为字节格式

解决Scapy捕获数据包转字节的报错问题

错误原因

你用sniff(iface='lo', count=1)得到的data是PacketList类型(类似列表的容器,哪怕只抓1个包),而raw()函数需要传入单个的数据包对象(比如Ether、IP这类),直接对PacketList调用raw()就会触发TypeError。

正确写法

要获取单个数据包的字节内容,只需要从PacketList里取出第一个元素(索引0)再调用raw():

from scapy.all import *

while True:
    # 捕获1个包,得到PacketList
    packet_list = sniff(iface='lo', count=1)
    # 取出第一个包,转成字节
    packet_bytes = raw(packet_list[0])
    # 可以直接存储或打印
    print(packet_bytes)

你的两种写法问题分析

  • 写法一:和最初的错误一样,直接对sniff返回的PacketList用raw(),没取单个包,所以报错。
  • 写法二:prn参数是用来处理每个捕获到的包的回调,这里lambda x: raw(x)会把每个包转成字节,但sniff返回的依然是原始的PacketList,所以print(data)输出的还是PacketList,不是字节数据。如果要通过prn存字节,可以改成这样:
from scapy.all import *

captured_bytes = None

def save_packet_bytes(packet):
    global captured_bytes
    captured_bytes = raw(packet)

while True:
    sniff(iface='lo', count=1, prn=save_packet_bytes)
    # 现在captured_bytes里就是字节形式的数据包
    print(captured_bytes)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:22:33