• 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。

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

  • 相关阅读:
    Leetcode463. Island Perimeter
    C++ 编写的解码器小程序 map
    LeetCode706. Design HashMap
    LeetCode705. Design HashSet
    LeetCode804. Unique Morse Code Words
    c++后台开发 准备材料
    Scott Young-《如何高效学习》
    跳表和散列
    时间复杂度 log n
    第35题:LeetCode138. Copy List with Random Pointer
  • 原文地址:https://www.cnblogs.com/workharder/p/12325908.html
Copyright © 2020-2023  润新知