我即将实现一个新的协议层。 目前,我一直坚持从 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
您可以这样使用
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 的内置函数将此数据包转换为二进制表示形式或通过网络发送它,前导零将被保留,因为字段大小是明确定义的。