关于QQwry格式

来源:互联网 发布:战龙三国挂机软件 编辑:程序博客网 时间:2024/06/17 17:20

关于QQwry格式

作者  cnss 2004-8-18
版权所有 转载请注明出处
http://blog.csdn.net/cnss

最近写了个比qqwry好的格式,点这里查看.

刚才通过RSS看到一篇关于QQwry格式的blog: http://blog.csdn.net/taft/archive/2004/08/18/77559.aspx

想不到QQwry还在用,这是俺两年前设计的,这个格式该被淘汰了.为什么这么说呢,因为它采用的是索引+二分查找来减小内存占用和提高查找速度.

由于采用二分查找,所以IP数据要被分为最小的片,假设有A,B两条数据,B数据完全覆盖A数据,那么转换为QQwry后两条数据就变成了三条.如果原始数据非常有条理,就可以避免这个现象,不过这是不可能的,几万条数据会越来越乱,所以QQwry的尺寸会迅速增加,之所以增长的不是特别快,是因为格式对重复数据有一定压缩.

QQwry.dat:"咦?我没吃那么多,怎么胖的那么快!?"

那篇文章是作者猜测的格式,我再把原来整理的发一遍吧.0x2 0x0 0x0 0x0不是错误,可能是给御风而行放版权信息的地方,另外附带ipsearcher.dll源码.

-----------------------------------------------
新格式说明

主要分为数据区和索引区
★数据区元素:
存放IP信息中的:结束IP(4字节),国家(不定长),地区(不定长)
排列顺序:无要求
★索引区元素:
存放IP信息中的:起始IP(4字节),索引值(3字节)
排列顺序:起始IP按升序排列
★IP为4字节,如"255.0.0.0"表示为0xFF000000,存在文件中则为00 00 00 FF(字节序原因)
★索引值为该IP消息的<结束IP、国家、地区>在文件中的位置。指向<结束IP>
★如果结束IP后的字节为0x01,则说明该IP消息的<国家、地区>与前面的IP信息重复,这时0x01后面的3个字节为国家、地区字符串的偏移量。可以根据这三个字节去前面找国家、地区。
★如果国家的第一个字节为0x02,说明该国家串与前面的国家或地区串重复,0x02后面的三个字节为该串的偏移量,可以根据该偏移量找到前面的串。
★如果地区的第一个字节为0x02,说明该地区串与前面的国家或地区串重复,0x02后面的三个字节为该串的偏移量,可以根据该偏移量找到前面的串。
★有可能在出现0x01的情况下出现0x02,这时需要跳转两次查找国家、地区字符串。
★正常的字符串以NULL做结尾。
★IP信息不允许有重复、覆盖
★使用索引是为了保证能以线性速度搜索
★新格式不允许为未知数据的IP消息,原格式中的未知数据已经都去掉了。如果有未知数据的IP信息,将大大增加文件长度。

文件的头4个字节是索引区第一个元素的偏移量,第二个4字节是索引区最后一个元素的偏移量。通过这两个偏移量,可以用二分法快速查找IP信息。如:一条IP信息是,要查询的IP为150
起始 结束  国家 地区
100  200 中国 北京
首先在索引区找到起始IP小于150的最后一个元素,通过索引,找到结束IP,如果150大于结束IP,说明是未知数据;如果150小于等于结束IP,则找到国家、地区。

发表于 @ 2004年08月18日 02:40:00 | 评论( 19 ) | 编辑| 举报| 收藏

旧一篇:探索网络专业书店的经营模式(原作) | 新一篇:Pastry学习笔记

查看最新精华文章 请访问博客首页相关文章
C++对象布局及多态实现的探索(三)
网络数据包监视程序开发(八)
啊哈,算法 之原语的力量
C++对象布局及多态实现的探索(五)
bigendian littleendian
做了道习题,搞不懂这个
获取字节的各个bit
USB的描述符及各种描述符之间的依赖关系

PiggyXP 发表于2004年8月27日 10:58:00  IP:举报回复
好东西^_^
cnss 发表于2004年8月27日 14:12:00  IP:举报回复
jerry:
页面右面有地址啊
dragon 发表于2004年9月3日 19:31:00  IP:举报回复

新的格式文件中有的,02 xx xx xx 不一定是便宜量
这是为什么?
dragon 发表于2004年9月3日 19:32:00  IP:举报回复
对文件格式还是糊里糊涂,呵呵,
cnss 发表于2004年9月3日 22:15:00  IP:举报回复
为了给御风而行放版权说明,在索引区之后有这个,0x2代表版权说明,0x1是别的信息,就扩充了这么两条.
通过文件的头8个字节就可以得出索引区在哪儿结束,后面的就是这些附加信息.当初只有几个版本是这样的.
cnss 发表于2004年9月4日 15:05:00  IP:举报回复
这好象是一个变种格式,我当初只用了0x1,0x2做跳转.用8个确实好!估算了一下,大约能省下几十K的空间.
当mode为1时省略mode也可以.
cnss 发表于2004年9月4日 15:11:00  IP:举报回复
用8个mode的话,如果m_ei求的正确,程序应该就是这个样子了
dragon 发表于2004年9月4日 08:54:00  IP:举报回复
终于搞清楚了,是不是这样子,
CString NL_QQwry::GetCountryLocal(BYTE bMode,int ioffset)
{
CString buf="";
if(bMode==1)//X 没有跳
{buf=GetStr(ioffset);buf+=" ";buf+=GetStr();}
if(bMode==2)//X Country不跳 Local 跳
{buf=GetStr(ioffset);buf+=" ";buf+=GetStr(m_ei.offset1);}
if(bMode==3)//2 Country跳 local不跳
{buf=GetStr(m_ei.offset1);buf+=" ";buf+=GetStr(ioffset+4);}
if(bMode==4)//2 Country跳 local跳
{buf=GetStr(m_ei.offset1);buf+=" ";buf+=GetStr(m_ei.offset2);}
if(bMode==5)//1 没有跳
{buf=GetStr(m_ei.offset1);buf+=" ";buf+=GetStr();}
if(bMode==6)//1 Country不跳 Local 跳
{buf=GetStr(m_ei.offset1);buf+=" ";buf+=GetStr(m_ei.offset2);}
if(bMode==7)//1 Country跳 Local 不跳
{buf=GetStr(m_ei.offset2);buf+=" ";buf+=GetStr(m_ei.offset1+4); }
if(bMode==8)//1 Country跳 Local跳
{buf=GetStr(m_ei.offset1);buf+=" ";buf+=GetStr(m_ei.offset2);}
return buf;
}
dragon 发表于2004年9月4日 08:58:00  IP:举报回复
同样的文章重复了,删除了,555555
taft 发表于2004年9月11日 10:19:00  IP:举报回复
谢谢你提供新的格式
cnss 发表于2004年9月11日 13:19:00  IP:举报回复
taft:
其实收集IP的人更辛苦,他们每天花好几个小时在这上面,一坚持就是几年,其中的枯燥是我们不能想象的.
更应该感谢他们.
dragon 发表于2004年9月12日 12:36:00  IP:举报回复
首先,非常感谢cnss提供格式的说明,这样剩了很多时间
从此基础上编写了NL_QQwry Class,之后转换成php格式
http://www.jiyongs.com/ftp/upload/QQwry.rar
cnss 发表于2004年9月12日 20:21:00  IP:举报回复
用PHP的朋友方便了:)
blue 发表于2004年12月16日 20:13:00  IP:举报回复
QQWry.dat中前面部分
DD D1 1D 00 22 CC 2D 00 FF FF FF 00 49 41 4E
其中FF FF FF 00是IP,49 41 4E是索引值么?
似乎不是,索引区和数据区是混杂在一起的?这样索引查找会快么?
我不是很懂,请大家给我讲讲,谢谢。
blue 发表于2004年12月16日 20:14:00  IP:举报回复
QQWry.dat中前面部分
DD D1 1D 00 22 CC 2D 00 FF FF FF 00 49 41 4E
其中FF FF FF 00是IP,49 41 4E是索引值么?
似乎不是,索引区和数据区是混杂在一起的?这样索引查找会快么?
我不是很懂,请大家给我讲讲,谢谢。
fxysunshine 发表于2005年9月27日 14:37:00  IP:举报回复
我想做个利用IP查找其所属的国家、地区信息,利用qqwry.dat文件,可以做到吗?很多IP查找出的信息没有地区信息啊,比如:中国网通××××网吧。请指教!
collay 发表于2006年1月12日 17:03:00  IP:举报回复
cnss 你好
在IPSearcher中有,分配空间时为何加9??
//malloc
ptr = (char*)malloc(nLength + 9);//为何加9 ??
if(!ptr)
{
CloseHandle(hFile);
MessageBox(NULL, "不能分配内存!", NULL, NULL);
return;
}
jykgps 发表于2008年5月24日 23:43:45  IP:举报回复
哎,终于找了.赶紧留个脚印.
原创粉丝点击