public class IPSeeker
extends java.lang.Object
用来读取QQwry.dat文件,以根据ip获得好友位置,QQwry.dat的格式是
一. 文件头,共8字节
1. 第一个起始IP的绝对偏移, 4字节
2. 最后一个起始IP的绝对偏移, 4字节
二. "结束地址/国家/区域"记录区
四字节ip地址后跟的每一条记录分成两个部分
1. 国家记录
2. 地区记录
但是地区记录是不一定有的。而且国家记录和地区记录都有两种形式
1. 以0结束的字符串
2. 4个字节,一个字节可能为0x1或0x2
a. 为0x1时,表示在绝对偏移后还跟着一个区域的记录,注意是绝对偏移之后,而不是这四个字节之后
b. 为0x2时,表示在绝对偏移后没有区域记录
不管为0x1还是0x2,后三个字节都是实际国家名的文件内绝对偏移
如果是地区记录,0x1和0x2的含义不明,但是如果出现这两个字节,也肯定是跟着3个字节偏移,如果不是,则为0结尾字符串
三. "起始地址/结束地址偏移"记录区
1. 每条记录7字节,按照起始地址从小到大排列
a. 起始IP地址,4字节
b. 结束ip地址的绝对偏移,3字节
注意,这个文件里的ip地址和所有的偏移量均采用little-endian格式,而java是采用
big-endian格式的,要注意转换
| 限定符和类型 | 类和说明 |
|---|---|
class |
IPSeeker.IPEntry
一条IP范围记录,不仅包括国家和区域,也包括起始IP和结束IP
|
class |
IPSeeker.IPLocation
用来封装ip相关信息,目前只有两个字段,ip所在的国家和地区
|
| 限定符和类型 | 方法和说明 |
|---|---|
java.lang.String |
getAddress(java.lang.String ip) |
java.lang.String |
getArea(byte[] ip)
根据IP得到地区名
|
java.lang.String |
getArea(java.lang.String ip)
根据IP得到地区名
|
java.lang.String |
getCountry(byte[] ip)
根据IP得到国家名
|
java.lang.String |
getCountry(java.lang.String ip)
根据IP得到国家名
|
static IPSeeker |
getInstance() |
java.util.List<IPSeeker.IPEntry> |
getIPEntries(java.lang.String s)
给定一个地点的不完全名字,得到一系列包含s子串的IP范围记录
|
java.util.List |
getIPEntriesDebug(java.lang.String s)
给定一个地点的不完全名字,得到一系列包含s子串的IP范围记录
|
IPSeeker.IPLocation |
getLocation(java.lang.String ip) |
public static IPSeeker getInstance()
public java.util.List getIPEntriesDebug(java.lang.String s)
s - 地点子串public java.util.List<IPSeeker.IPEntry> getIPEntries(java.lang.String s)
s - 地点子串public IPSeeker.IPLocation getLocation(java.lang.String ip)
public java.lang.String getCountry(byte[] ip)
ip - ip的字节数组形式public java.lang.String getCountry(java.lang.String ip)
ip - IP的字符串形式public java.lang.String getArea(byte[] ip)
ip - ip的字节数组形式public java.lang.String getArea(java.lang.String ip)
ip - IP的字符串形式public java.lang.String getAddress(java.lang.String ip)