可变长整数是SQLite的特色之一,使用它既可以处理大整数,又可以节省存储空间。由于单元中大量使用可变长整数,故在此先加以介绍。
可变长整数由1~9个字节组成,每个字节的低7位有效,第8位是标志位。在组成可变长整数的各字节中,前面字节(整数的高位字节)的第8位置1,只有最低一个字节的第8位置0,表示整数结束。
可变长整数可以不到9个字节,即使使用了全部9个字节,也可以将它转换为一个64-bit整数。
当可变长整数达到9个字节,第9个字节的第8位置不再是标志位,其8位均有效。
下面是一些可变长整数的例子:
0x00 转换为 0x00000000
0x7f 转换为 0x0000007f
0x81 0x00 转换为 0x00000080
0x82 0x00 转换为 0x00000100
0x80 0x7f 转换为 0x0000007f
0x8a 0x91 0xd1 0xac0x78 转换为 0xa2345678
0x81 0x81 0x81 0x810x01 转换为 0x10204081
可变长整数可用于存储rowid、字段的字节数或Btree单元中的数据。
举例说明变换过程:
3字节整数:0xA1 0x94 0x56 先转换为二进制:
10100001 10010100 01010110
移除最高位变成:
0100001 0010100 1010110 <24位>=》 01000 01001010 01010110<21位>
转换成16进制:0x08 0x49 0x56