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

如何在自定义Scapy Packet类中设置字段字节长度

Scapy固定长度自定义报文实现

Scapy 中支持任意固定字节长度的通用字段为 StrFixedLenField,不受 ByteField 仅支持1字节的限制,完全匹配你需要的字段长度要求,完整类定义如下:

from scapy.packet import Packet
from scapy.fields import StrFixedLenField

class MyPacketStructure(Packet):
    name = "MyPacketStructure"
    fields_desc = [
        StrFixedLenField("field1", b"\x00"*2, length=2),
        StrFixedLenField("field2", b"\x00"*16, length=16),
        StrFixedLenField("field3", b"\x00"*12, length=12),
        StrFixedLenField("field4", b"\x00"*17, length=17),
        StrFixedLenField("data", b"\x00"*83, length=83),
    ]

相关问题说明

  • 字段选型规则:如果对应字段是存储整数值的语义,2字节的field1也可以替换为ShortField(默认无符号2字节整数),但对于12、17这类非标准整数字节长度的字段,直接用StrFixedLenField是最通用的方案,不需要额外自定义字段逻辑。
  • data载荷选型:你要求data固定占83字节,用StrFixedLenField是最稳妥的;只有当data是可变长度的尾部载荷时,才需要换用StrLenField或留空让Scapy自动匹配剩余字节。
  • 短数据填充逻辑:StrFixedLenField自带默认填充能力,如果你传入的data实际只有43字节,Scapy会自动在字段尾部补零(b'\x00')凑满83字节,不需要手动写填充逻辑。测试示例:
# 传入仅43字节的data
pkt = MyPacketStructure(data=b"t"*43)
# 序列化后总长度固定为2+16+12+17+83=130字节,data尾部自动补40个零字节
pkt_raw = bytes(pkt)
print(len(pkt_raw)) # 输出130

如果协议要求用非零值填充剩余字节,可以在传入字段值时手动用指定字符补齐长度,常规网络协议默认均采用零填充,直接使用默认逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:42:22