LengthFieldBasedFrameDecoder的参数lengthAdjustment是什么意思

lengthAdjustment是DotNetty库 自定义长度帧解码器(LengthFieldBasedFrameDecoder)的参数。

这里说下所有参数的含义,结合自己项目中包体结构来说明(其实就是自己的理解):

(1) maxFrameLength - 发送的数据包最大长度;

(2) lengthFieldOffset - 长度域偏移量,指的是长度域位于整个数据包字节数组中的下标;

(3) lengthFieldLength - 长度域的自己的字节数长度。

(4) lengthAdjustment – 长度域的偏移量矫正。 如果长度域的值,除了包含有效数据域的长度外,还包含了其他域(如长度域自身)长度,那么,就需要进行矫正。矫正的值为:包长 - 长度域的值 – 长度域偏移 – 长度域长。

以我们项目的消息结构体为例:

/**
* 解包函数
* c++的消息体
* 这是我们项目的消息结构体 typedef struct _packet_client_st { short m_i2Begin; int m_i4DataSize; char m_i1RandSeed; char m_i1CheckSum; int m_i4Compress; short m_i2PacketID; short m_i2Index; char m_szData[0]; _packet_client_st() { memset(this, 0, sizeof(*this)); } }EventClientPacket }

自己理解:

长度域是什么意思?长度域就是消息包的数据部分,就是指消息体中的 m_szData。

lengthFieldOffset:是指 m_i4DataSize 字段从 _packet_client_st 开始偏移的字节数。在这里应该是2,因为 m_i2Begin是short类型,2个字节,所以是2。

lengthFieldLength:是指 m_szData 数组的长度所占字节数,这里是4,因为 sizeof(m_i4DataSize) 等于4,所以是4。

lengthAdjustment:是指 m_szData[0] 字段从 _packet_client_st 的 m_i2DataSize 开始偏移的字节数。这里应该是10,因为 sizeof(m_i1RandSeed + m_i1CheckSum + m_i4Compress + m_i2PacketID + m_i2Index) 等于10。所以是10。

如果有大牛觉得我理解有偏差,请给我留言。

 

posted @ 2020-02-18 13:43  菜鸡徐思  阅读(1920)  评论(0编辑  收藏  举报