此IP文件,融合了 Taobao Ip 和 GeoIP 。使用 IANA ip 段。有 国家,区域,城市,运营商,时区,经度,维度 字段。
字节序使用 little-endian,使用其他字节序的主机需要自行处理。
ps: little-endian 中数字是倒序的,其他是正常排序。
头12个字节,每4个是一个 uint32 数字。分别是:
索引起始地址 | 数据起始地址 | 索引IP数量 |
---|---|---|
6a 5f 2a 00 | c8 10 02 00 | 58 eb 01 00 |
ps: 上面的12个字节只是示例,当文件里IP数据改变时会有变化,以实际为准。
每一段文本 string 都以字节 0x00 结束,所有文字数据都是UTF-8编码的。
每 21 个字节为一段,其顺序为:
flag | 国家代码 | 区域 | 城市 | 运营商 | 时区 | 经度 | 维度 |
---|---|---|---|---|---|---|---|
uint8 - 1 | string - 2 | uint16 - 2 | uint32 - 4 | uint16 - 2 | uint16 - 2 | float32 - 4 | float32 - 4 |
- flag == 1 IANA保留地址
- flag == 2 已分配地址
- flag == 4 IANA未分配地址
当 country_code 全等于字节 0x00 时,或者,flag标识为保留地址或未分配地址。那么其后面的数据都是不存在的。
country_code 为国家代码 eg: CN
region, city, isp, timezone 都是连接到文本区的地址,此地址为绝对地址,从文件开始处起始。
longitude, latitude 则是 float32 的经纬度
每 4 个字节为一个ip范围起始数字地址,uint32,总共数量为 索引IP数量
0.0.0.0 ~ 255.255.255.255 之间的IP地址,索引区已经覆盖。
意味着,在索引里,匹配IP地址时,当一个IP地址大于等于IP A,小于他的下一个IP B时,那他就是匹配A的,从而计算出数据地址。
关于数据地址计算:
数据区里的分段数和索引区的是相同的,所以当前索引的地址对应的数据地址是:
数据地址 = 索引地址 / 4 * 21 + 数据起始地址
ps: 上述公式里“索引地址”表示从索引起始地址开始的字节长度