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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:22