Netty LengthFieldBasedFrameDecoder使用场景分析

本文详细介绍了七种不同场景下的解码器参数配置方法,包括长度偏移、长度字段长度、长度调整值及头部剥离等关键参数的设置,帮助读者理解如何针对不同数据帧结构进行正确配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(转载自:http://asialee.iteye.com/blog/1784844)


在使用这个decoder的时候,经常要考虑参数如何设置,如果7种case基本上把应用场景都涵盖了。


  •  第一种情况:从lenght从头开始,长度为2,不跳过头部

                  

C代码  收藏代码
  1. lengthFieldOffset   = 0  
  2.  lengthFieldLength   = 2  
  3.  lengthAdjustment    = 0  
  4.  initialBytesToStrip = 0 (= do not strip header)  
  5.   
  6.  BEFORE DECODE (14 bytes)         AFTER DECODE (14 bytes)  
  7.  +--------+----------------+      +--------+----------------+  
  8.  | Length | Actual Content |----->| Length | Actual Content |  
  9.  | 0x000C | "HELLO, WORLD" |      | 0x000C | "HELLO, WORLD" |  
  10.  +--------+----------------+      +--------+----------------+  

  •  第二种情况,从length从头开始,长度为2,跳过头部
C代码  收藏代码
  1. lengthFieldOffset   = 0  
  2. lengthFieldLength   = 2  
  3. lengthAdjustment    = 0  
  4. initialBytesToStrip = 2 (= the length of the Length field)  
  5.   
  6. BEFORE DECODE (14 bytes)         AFTER DECODE (12 bytes)  
  7. +--------+----------------+      +----------------+  
  8. | Length | Actual Content |----->| Actual Content |  
  9. | 0x000C | "HELLO, WORLD" |      | "HELLO, WORLD" |  
  10. +--------+----------------+      +----------------+  

     这个和上面的区别是,数据经过解码后头部被去掉了

 

  • 第三种情况,2个字节长度的头部,offset是0,但是长度代表的是整个数据帧的长度,即就是包含头部
Java代码  收藏代码
  1. lengthFieldOffset   =  0  
  2.  lengthFieldLength   =  2  
  3.  lengthAdjustment    = -2 (= the length of the Length field)  
  4.  initialBytesToStrip =  0  
  5.   
  6.  BEFORE DECODE (14 bytes)         AFTER DECODE (14 bytes)  
  7.  +--------+----------------+      +--------+----------------+  
  8.  | Length | Actual Content |----->| Length | Actual Content |  
  9.  | 0x000E | "HELLO, WORLD" |      | 0x000E | "HELLO, WORLD" |  
  10.  +--------+----------------+      +--------+----------------+  

 

  • 第四种情况,5个字节长度的头部,但是数据帧的lenght的字节数是3,offset是2,不跳过头部
Java代码  收藏代码
  1. lengthFieldOffset   = 2 (= the length of Header 1)  
  2. lengthFieldLength   = 3  
  3. lengthAdjustment    = 0  
  4. initialBytesToStrip = 0  
  5.   
  6. BEFORE DECODE (17 bytes)                      AFTER DECODE (17 bytes)  
  7. +----------+----------+----------------+      +----------+----------+----------------+  
  8. | Header 1 |  Length  | Actual Content |----->| Header 1 |  Length  | Actual Content |  
  9. |  0xCAFE  | 0x00000C | "HELLO, WORLD" |      |  0xCAFE  | 0x00000C | "HELLO, WORLD" |  
  10. +----------+----------+----------------+      +----------+----------+----------------+  

 

 

  • 第五种情况,5个字节长度的头部,但是数据帧的lenght的字节数是3,offset是0,不跳过头部

 

Java代码  收藏代码
  1. lengthFieldOffset   = 0  
  2.  lengthFieldLength   = 3  
  3.  lengthAdjustment    = 2 (= the length of Header 1)  
  4.  initialBytesToStrip = 0  
  5.   
  6.  BEFORE DECODE (17 bytes)                      AFTER DECODE (17 bytes)  
  7.  +----------+----------+----------------+      +----------+----------+----------------+  
  8.  |  Length  | Header 1 | Actual Content |----->|  Length  | Header 1 | Actual Content |  
  9.  | 0x00000C |  0xCAFE  | "HELLO, WORLD" |      | 0x00000C |  0xCAFE  | "HELLO, WORLD" |  
  10.  +----------+----------+----------------+      +----------+----------+----------------+  

    这个稍微解释一下,由于我们的头部是5个字节,但是length数据域只有3个字节,所以lengthAdjustment是2,表明需要2个字节来调整整个帧的长度。

 

  • 第六种情况,4个字节长度的头部,但是数据帧的lenght的字节数是2,offset是1,跳过头部第一个数据域和长度域
Java代码  收藏代码
  1. lengthFieldOffset   = 1 (= the length of HDR1)  
  2.  lengthFieldLength   = 2  
  3.  lengthAdjustment    = 1 (= the length of HDR2)  
  4.  initialBytesToStrip = 3 (= the length of HDR1 + LEN)  
  5.   
  6.  BEFORE DECODE (16 bytes)                       AFTER DECODE (13 bytes)  
  7.  +------+--------+------+----------------+      +------+----------------+  
  8.  | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content |  
  9.  | 0xCA | 0x000C | 0xFE | "HELLO, WORLD" |      | 0xFE | "HELLO, WORLD" |  
  10.  +------+--------+------+----------------+      +------+----------------+  

         这个我稍微解释一下,HDR1是一个字节,Lenght是2个字节,HDR2是两个字节,解码后需要包含HDR2,所以lenghtFieldOffset是1,lenghtFieldLenght是2,lenghtAdjustment是1,实际上就是HDR2的长度,initailBytesToStrip是3,实际上就是HDR1+LEN的长度。

 

  • 第七种情况,4个字节长度的头部,但是数据帧的lenght的字节数是2,offset是1,跳过头部第一个数据域和长度域,消息的长度代表整个数据帧的长度
Java代码  收藏代码
  1. lengthFieldOffset   =  1  
  2.  lengthFieldLength   =  2  
  3.  lengthAdjustment    = -3 (= the length of HDR1 + LEN, negative)  
  4.  initialBytesToStrip =  3  
  5.   
  6.  BEFORE DECODE (16 bytes)                       AFTER DECODE (13 bytes)  
  7.  +------+--------+------+----------------+      +------+----------------+  
  8.  | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content |  
  9.  | 0xCA | 0x0010 | 0xFE | "HELLO, WORLD" |      | 0xFE | "HELLO, WORLD" |  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值