最近遇到类似于Protobuf的格式的文件。于是根据同事给的分析思路自己写了一套解析的代码,这里只展示怎么解析VarInt;
1> 1 byte = 8 bits,
var bt = 0b_1111_0000
Varint是根据字节的最高位来判断是否读取下一个字节,11110000最高位是1(最左边是最高位),所以这里还要往下读取一个字节,直到读取到最高位是0的字节的位置,然后取从开始到最高位是0的这个字节,每个字节只取7个bit位,然后从后面的字节开始读取,这样就可以了。
2> 给个字节数组,来尝试一下:
var bs = new byte[] { 0xF0, 0x81, 0x88, 0x10 };
写的更加容易理解一点:
var bs = new byte[] { 0b_1111_0000, 0b_1000_0001, 0b1000_1000, 0b_0001_0000 };
前3个字节的最高位都是1,所以读到第4个结束,
那么只取这个4个字节的7个bit位就是
var bt = 0b 1110000 0000001 0001000 0010000;
因为是从后面读取的,这里需要颠倒一下顺序
var bt = 0b 0010000 0001000 0000001 1110000; //336