变长整数是8个bit为一组(也就是一个字节),最高位是判断为,当最高位为0时表示当前字节为该整数的最后一个字节,当最高位为1时表示后面的一个字节也表示这个整数。用一个例子来说明:
eg:0x81 95 E3 21
上面的整数第一个字节的最高位为1,继续向后读一个字节;第二个字节最高位也为1,继续向后读一个字节,第三个字节最高位也为1,继续向后读一个字节;第四个字节最高位为0,停止。
接下来就是将变长整数转为定长整数,转化的过程就是去符号位的过程。
首先将16进制的变长整数转为2进制:
1000 0001 1001 0101 1110 0011 0010 0001
去掉符号位后变成:
000 0001 001 0101 110 0011 010 0001
从低位像高位四个一组重新组成16进制数:
0x25 71 A1
从变长转定长的过程就结束了。
结束语
这篇博客参考了很多资料,主要的参考资料有:
1.《SQLite数据库文件格式全面分析》——空转,这篇文章对SQLite3数据库文件结构分析的很详细,但是其中有一个有歧义的地方是,作者在2.3节介绍大文件内部页单元结构的时候忽略了最右孩子页号后面结根的是该页各个单元起始地址这一情况,将各单元起始地址也归为未分配空间部分了。
2.《基于Android手机SQLite的取证系统设计实现》——朱清华
3. 该链接处讲了SQLite数据库的基本应用知识,包括与C/C++和Java的接口使用。