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。

如果有大牛覺得我理解有偏差,請給我留言。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM