手机/IP归属地查询
- 根据csv生成dat文件,数据源csv由自己更新
- 基于二分法查找
pip install region-search
dat_maker --type ip --cfg /path/ip_config.ini
dat_maker --type phone --cfg /path/phone_config.ini
| 4 bytes | <- 版本号
------------
| 4 bytes | <- 第一个索引的偏移
-----------------------
| data1 | <- 记录区数据1
-----------------------
| dataN | <- 记录区数据N
-----------------------
| index1 | <- 索引区索引1
-----------------------
| indexN | <- 索引区索引N
-----------------------
头部
头部为8个字节,版本号为4个字节,第一个索引的偏移为4个字节(<4sI)。记录区
中每条记录的格式为"<省份>|<城市>|<运营商>\0"。 每条记录以'\0'结束。索引区
中每条记录的格式为"<手机号前七位><记录区的偏移>",每个索引的长度为8个字节(<II
)。
头部
头部为8个字节,版本号为4个字节,第一个索引的偏移为4个字节(<4sI)。记录区
中每条记录的格式为"<国家>|<省份>|<城市>|<区>|<运营商>\0"。 每条记录以'\0'结束。索引区
中每条记录的格式为"<ip段起始地址><记录区的偏移>",每个索引的长度为8个字节(<II
)。
- 解析头部8个字节,得到索引区的第一条索引的偏移。
- 在索引区用二分查找得出待查询数据在记录区的记录偏移。
- 在记录区从上一步得到的记录偏移处取数据,直到遇到'\0'。
- 根据记录区具体的数据格式进行解析。
- 解析IP/phone数据库csv文件,根据配置文件对关键字段名称进行转换。
- 根据IP/phone排序生成一个新的数组。
- 通过解析数据,分别生成header区,data区,index区三个buffer,最终合为一个dat文件