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。
如果有大牛覺得我理解有偏差,請給我留言。