Scapy 位字段保留前导 0

问题描述 投票:0回答:1

我即将实现一个新的协议层。 目前,我一直坚持从 packet 继承的第一个类的实现。 这个类只有两个字段: f_code = 4 位 地址 = 12 位。

问题是我尝试使用BitField,但此类确实转换为 int,这消除了前导 0,因此生成的数据包大小并不总是 16 位。

另一个想法是将此字段作为字符串处理,但我找不到最佳的字段类型。
我尝试了xStrField,这里的问题是,这个字段的大小不是8的整倍数,而是0.5 * 8(4位)和1.5 * 8(12位),

class xy(Packet):
    name = "xy packet"

    fields_desc = [
        XStrField("f_code", b'\x00' * 0.5),
        XStrField("s_address", b'\x00' * 1.5)
    ]

抛出错误

XStrField("f_code", b'\x00' * 0.5), 
TypeError: can't multiply sequence by non-int of type 'float'

有人知道在这里做什么吗?字段的文档在描述所有相应字段时相当不完整,Scapy Fields Documentation。 我期待我的类的数据包初始化如下:

xy = XY(f_code=0x1, s_address=0x420)

结果为0x4420,二进制表示为:0100 0100 0010 0000

python network-programming scapy
1个回答
0
投票

您可以这样使用

BitField

from scapy.all import Packet, BitField

class XY(Packet):
    name = "XY packet"
    fields_desc = [
        BitField("f_code", 0, 4),  # 4 bits
        BitField("s_address", 0, 12)  # 12 bits
    ]

xy_packet = XY(f_code=0x1, s_address=0x420)
binary_representation = bytes(xy_packet)
print(binary_representation.hex())

通过使用 Scapy 的内置函数将此数据包转换为二进制表示形式或通过网络发送它,前导零将被保留,因为字段大小是明确定义的。

© www.soinside.com 2019 - 2024. All rights reserved.