7位变长编码,适用于储存和网络发送整数数据,在一些讲究效率的场合,比如时序数据库里有使用。

public int Read7bitEncodedInt()
{
    int num = 0;
    int num2 = 0;
    byte b;
    do
    {
        b = mBuffer[mPosition++];
        num |= (b & 0x7F) << (num2 & 0x1F);
        num2 += 7;
    }
    while ((b & 0x80u) != 0);
    return num;
}
public void Write7BitEncodedInt(int val)
{
    while (val >= 128)
    {
        Write((byte)((uint)val | 0x80u));
        val >>= 7;
    }

    Write((byte)val);
}

这是一个用于读取7位编码整数的C#方法。7位编码是一种变长编码方式,用于紧凑地表示较小的整数,以减小传输或存储的数据量。方法的逻辑如下:

  1. num 是用于存储解码后的整数的变量,初始化为0。
  2. num2 是一个用于跟踪当前位的变量,初始化为0。
  3. 使用 do-while 循环来逐个读取字节并解码整数。
  4. 在循环中,从输入字节数组 mBuffer 的当前位置 mPosition 处读取一个字节 b
  5. 对读取的字节执行位运算和移位操作,将字节的低7位存储到 num 中,并将 num2 用作位偏移。
  6. 检查字节的最高位(第8位,即b & 0x80u)是否为1,如果为1,表示后面还有一个字节,需要继续解码。循环在这里继续执行。
  7. 如果最高位为0,表示整数的编码结束,循环结束。
  8. 返回解码后的整数 num

这个方法的实现是根据7位编码的规则进行的。每个字节的最高位用于指示是否还有下一个字节,低7位用于存储整数的一部分。多个字节被串联在一起,直到最高位为0表示结束。这种方式可以有效地表示小范围的整数,且数据压缩。

虽然7位编码有一些优点,如数据紧凑,对小范围整数的表示较为高效,但也存在一些缺点:

  1. 不适用于负数: 该方法没有考虑负数的情况,因为最高位始终用于指示下一个字节,因此无法直接用于表示负数。
  2. 可读性差: 7位编码的数据在二进制形式下不够直观,可读性较差。这使得在调试或手动分析数据时可能会更加困难。
  3. 不适用于大整数: 由于每个字节只能存储7位的有效数据,因此对于大整数,需要使用更多的字节来表示,可能导致空间浪费。
  4. 不具有灵活性: 这种方法假设了整数的范围相对较小,对于更大范围的整数,可能需要更多的字节,因此在一些场景下可能不够灵活。
  5. 对字节的使用效率不高: 由于整数的表示可能跨越多个字节,因此在某些情况下,可能会导致对字节的使用效率不高,特别是当数据中存在许多小整数时。

在选择数据编码方式时,需要根据具体的应用场景和需求权衡这些优点和缺点。如果数据主要是小范围整数,并且紧凑性是关键因素,那么7位编码可能是一个合适的选择。否则,可能需要考虑其他编码方式,如变长整数编码或直接使用固定长度整数表示。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据