C# 7 位整数的变长编码
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位编码是一种变长编码方式,用于紧凑地表示较小的整数,以减小传输或存储的数据量。方法的逻辑如下:
num
是用于存储解码后的整数的变量,初始化为0。num2
是一个用于跟踪当前位的变量,初始化为0。- 使用
do-while
循环来逐个读取字节并解码整数。 - 在循环中,从输入字节数组
mBuffer
的当前位置mPosition
处读取一个字节b
。 - 对读取的字节执行位运算和移位操作,将字节的低7位存储到
num
中,并将num2
用作位偏移。 - 检查字节的最高位(第8位,即
b & 0x80u
)是否为1,如果为1,表示后面还有一个字节,需要继续解码。循环在这里继续执行。 - 如果最高位为0,表示整数的编码结束,循环结束。
- 返回解码后的整数
num
。
这个方法的实现是根据7位编码的规则进行的。每个字节的最高位用于指示是否还有下一个字节,低7位用于存储整数的一部分。多个字节被串联在一起,直到最高位为0表示结束。这种方式可以有效地表示小范围的整数,且数据压缩。
虽然7位编码有一些优点,如数据紧凑,对小范围整数的表示较为高效,但也存在一些缺点:
- 不适用于负数: 该方法没有考虑负数的情况,因为最高位始终用于指示下一个字节,因此无法直接用于表示负数。
- 可读性差: 7位编码的数据在二进制形式下不够直观,可读性较差。这使得在调试或手动分析数据时可能会更加困难。
- 不适用于大整数: 由于每个字节只能存储7位的有效数据,因此对于大整数,需要使用更多的字节来表示,可能导致空间浪费。
- 不具有灵活性: 这种方法假设了整数的范围相对较小,对于更大范围的整数,可能需要更多的字节,因此在一些场景下可能不够灵活。
- 对字节的使用效率不高: 由于整数的表示可能跨越多个字节,因此在某些情况下,可能会导致对字节的使用效率不高,特别是当数据中存在许多小整数时。
在选择数据编码方式时,需要根据具体的应用场景和需求权衡这些优点和缺点。如果数据主要是小范围整数,并且紧凑性是关键因素,那么7位编码可能是一个合适的选择。否则,可能需要考虑其他编码方式,如变长整数编码或直接使用固定长度整数表示。