Scapy中NBytesField字节序异常:编码解码结果不一致
Scapy NBytesField 编码解码字节序不一致问题解决
问题根源
Scapy的NBytesField默认行为存在字节序不一致的问题:
- 编码(整数转字节):会将整数转换为大端字节序的指定长度字节串,符合需求;
- 解码(字节转整数):却将字节串按小端字节序解析为整数,导致解码后得到错误数值。
从测试案例可见:
- 编码时传入
data=0x8,生成的字节串是大端的b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08'; - 解码时该字节串被按小端解析为
0x080000000000000000000000(即你看到的大数值),而非预期的0x8。
而IntField因默认采用一致的大端字节序处理编码和解码,所以无此问题。
解决方案
自定义一个保持大端字节序一致的字段,继承NBytesField并重写编码和解码逻辑:
from scapy.fields import NBytesField from scapy.packet import Packet class BigEndianNBytesField(NBytesField): def m2i(self, pkt, m): # 将字节串按大端转换为整数 return int.from_bytes(m, byteorder='big') def i2m(self, pkt, i): # 将整数转换为指定长度的大端字节串 return i.to_bytes(self.length, byteorder='big') # 使用自定义字段定义协议 class TestClass(Packet): name = "test" fields_desc = [ BigEndianNBytesField("data", 0, 12) # 12字节长度,默认值0 ]
测试验证
- 创建包:
a = TestClass(data=0x8) print(a.data) # 输出:8 print(raw(a)) # 输出:b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08'
- 解码包:
b = TestClass(raw(a)) print(b.data) # 输出:8,符合预期
通过自定义字段,确保编码和解码都采用大端字节序,彻底解决数值不一致的问题。
内容的提问来源于stack exchange,提问作者Jeff Lieu
相关产品推荐
相关产品推荐

