本篇是ZX Inc的IPv6数据库中的数据存储格式分析,在多次修改和热心读者帮助下已经写出了整个结构。
ZX IPv6数据库下载地址:http://ip.zxinc.tk/
如果您想要使用本篇介绍的内容,请先参考页面上方或下方的许可协议!
以下是我以ZX 20110430版本数据库为例的分析结果:
0x0000 – 0x0003:ASCII “IPDB”(0x49 50 44 42),用来识别数据库类型。
0x0006:Byte 2(0x02),这是偏移地址长度。这个长度用于下方[1]处。
0x0007:Byte 8(0x08),这是IP地址长度。这个长度用于下方[2]处。
0x0008 – 0x000F:Int64 15725(0x6D 3D 00 00 00 00 00 00),这是数据库中的记录总条数。
0x0010 – 0x0017:HEX(0xF6 89 00 00 00 00 00 00),这是数据库地址段的开始位置。下面跳到这个地址(0x89F6)。
0x89F6 – 0x89FD [2]:IPv6(0x00 00 00 00 00 00 00 00),这是一个IPv6 /64段的记录起始地址,终止地址是下一条记录起始地址减1。
0x89FE – 0x89FF [1]:HEX(0xBB 88),这是本条记录对应的地理信息在数据库中的位置。下面跳到这个地址(0x88BB)。
0x88BB – 0x88BD:HEX(0x02 53 62),0x01和0x02开始的标志意味着跳转,后两个字节就是跳转地址。下面跳到这个地址(0x6253)。
0x6253 – 0x6263:UTF-8 String “IANA保留地址”(0x49 41 … 00),这是一个UTF8的字符串,以0x00结尾,也就是上述IP段对应的地理信息。每条IP记录对应两个地理信息的字符串(例如“山东省济南市 山东大学”),因此下面跳回到刚才的地址来获取第二段。
0x88BE:UTF-8 String(空,0x00)。如果开头不是0x01或0x02即为直接字符串,0x00结束说明为空串。之后跳回下一条IP记录(0x8A00)继续读取即可。一共读取15725次,其实只有15724条有效记录,最后一条记录(0xFF FF FF FF FF FF FF FF)对应的是数据库的版本信息,但是可以用来计算倒数第二条的结束地址(但是建议直接用这个地址作为倒数第二条记录的结束地址)。
以上就是整个数据库的数据部分格式,在下方comment(不是大神就是原作者)的帮助下已经补充全了整个数据部分的内容,感谢这位未署名的游客的协助。我的这个分析是从提取数据的算法角度来写的,comment中的是整个数据库的格式总览,表达的意义是相同的。
如果您想要使用本篇介绍的内容,请先参考页面上方或下方的许可协议!
文件头
0~3 字符串 "IPDB"
4~5 short 版本号,现在是1
6 byte 偏移地址长度(2~8)
7 byte IP地址长度(4或8或12或16, 现在只用8)
8~15 int64 记录数
16~23 int64 索引区第一条记录的偏移
24~31 int64 保留
记录区
(没有结束IP地址)
字符串 跟qqwry格式相同,采用UTF-8编码
索引区
+0~(0+IP长) little endian, 开始IP地址
+IP长~(IP长+偏移长) little endian, 记录偏移地址
感谢您提供的信息!(好久没看评论,这才刚approve的)
这是一个IPV6 /64段的记录起始地址
———————-这是什么意思?
@xiaomeng:就是一个长度为64的子网段里的第一个地址。