2cc070112
37027
|
2009/3/30 14:10:35 |
收藏了,谢谢 |
2cc070112
37026
|
2009/3/30 14:08:55 |
先收仓,谢谢 |
coldwind8112
17125
|
2005/8/22 14:56:04 |
此东东已经更新上传了,正在审核中……,马上有更新版下载,审核通过后将马上在此贴出地址。 更新了以下几点: ①大大加快读取速度(在大量的循环中尤其明显) ②地区查IP ③IP地址段查IP ④解压成文本文件(一般情况下可以在3秒内完成) 若本程序能给您的工作带来帮助,请留言支持一下,我将十分感谢! |
coldwind8112
16982
|
2005/8/15 16:29:57 |
此东东即将更新,尽情留意!即将推出新版本!更多功能!更快速度! |
yumato
14349
|
2005/4/26 14:24:29 |
搞什么啊,明知我是菜鸟,怎没地区查IP啊,这个最重要了,我不会啊 5555555555 |
hongsing
14154
|
2005/4/20 14:55:18 |
感谢无私奉献,比偶写的快多了。 |
yuzi
14042
|
2005/4/16 0:51:06 |
谢谢冷风! 下载的人好像挺多的嘛,怎么就没人讨论一下呢?晕~~~~~~~~~~ |
coldwind8112
14035
|
2005/4/15 21:06:10 |
关于FileStream慢的问题正在想更好的办法,当前就发现太慢,但一时没有更好的办法…… |
coldwind8112
14034
|
2005/4/15 21:03:09 |
在<=中的=情况发生的前提条件就是整个二分法查询到IPRecordFrom和IPRecordTo为同一条记录,因此只要满足我修正后的条件应该就没有问题了
这样写更清楚一点 if (IPRecordFrom=IPRecordTo) or ((IPValue>=CompareIPValue1) and (IPValue<CompareIPValue2)) then begin |
yuzi
13970
|
2005/4/13 12:50:49 |
晕,or 前面两个加个括号就可以了。。。 另外,假设以后最后一条记录IP段变成 255.255.255.255 - 255.255.255.255 时 这样是不是找不到最后那条条记录了呢?因为(IPValue<CompareIPValue2)将始终为假, 我觉得应该把“<”改为“<=”才行,是吗? |
yuzi
13969
|
2005/4/13 12:27:56 |
to coldwind8112: 刚才没有试,现在试了一下,发现你的方法也是不行的,查询结果是错误的, 255.255.255.0 -- 255.255.255.255 IP段地址信息应该是: 纯真网络 2005年4月5日IP数据 |
yuzi
13967
|
2005/4/13 12:16:55 |
突然想到上面的方法只能图一时之利,以后QQWry.dat如果在 255.255.255.0 -- 255.255.255.255之间增加了IP记录,就会定位错误了。。。呵呵 |
yuzi
13963
|
2005/4/13 11:24:34 |
还有就是使用TFileStream流读取数据太慢了, 我模仿其它工具遍历导出IP库到Text文件,用了10秒左右(而且我是用文件映射的方式写文本文件的,如果是用textFile => Writeln()写的那就要20秒以上了, 不知道谁有更快的方法或改写过的TFileStream,Mail我一份,谢谢! biout@126.com |
yuzi
13962
|
2005/4/13 11:17:05 |
对于那个Bug,我是这样改的(主要是觉得这样可以减少循环判断): 在这句前面加条件: Result := SearchIPRecordID(1, GetRecordCount, ipVal); 变成(其实就是最后一条记录,请大家看一下行不行:): if ipVal > 4294967039 then //即 4294967039 = GetIPValue('255.255.254.255')的值。 Result := GetRecordCount else Result := SearchIPRecordID(1, GetRecordCount, ipVal); 对于跟Inet_Addr()函数返回值不同的问题,我对比了一下以后,我觉得可能是创造QQwry数据库的作者对分点式IP高低位理解相反所致。。。 |
coldwind8112
13960
|
2005/4/12 21:45:44 |
有什么疑问或BUG请大家提出,共同学习提高 您的留言就是我的动力 |
coldwind8112
13959
|
2005/4/12 21:43:31 |
回答yuzi关于GetIPValue(IP: string): Cardinal; 目的正如yuzi所说的取点分IP的数值型IP值的 没有用Inet_addr()函数,是因为嘿嘿不好意思 不知道有这个函数 至于结果为什么不一样这就有点奇怪了,我没有测试过不过IP地址的点分形式只是为了写法上方便,其实就是一个32位的整数值罢了,将点分形式的每部分转化为2进制拼合就行了 |
coldwind8112
13958
|
2005/4/12 21:38:35 |
问题解决,请下载的朋友们自行修改 untQQWry.pas
将 //找到了 if (IPValue>=CompareIPValue1) and (IPValue<CompareIPValue2) then begin
修改为 //找到了 if (IPRecordFrom=IPRecordTo) or (IPValue>=CompareIPValue1) and (IPValue<CompareIPValue2) then begin |
coldwind8112
13957
|
2005/4/12 21:23:50 |
yuzi提出的程序中的BUG已经找到,主要是由于255.255.255.1 -- 255.255.255.255这一段记录恰好是最好一条记录,在进行二分法查找的时候要和邻近的记录(即下一条记录)进行比对时发生了溢出造成的。正在修改中…… |
coldwind8112
13950
|
2005/4/12 15:38:08 |
函数都是我写的 与原作者无关 我只是根据网上的一些QQ格式代码做了一个DELPHI版本的工具 yuzi提出的问题我也发现了 研究中…… |
yuzi
13912
|
2005/4/11 12:03:41 |
当IP是从 255.255.255.1 -- 255.255.255.255 的某一字串时,会出现“Stack overflow” 错误! 还有问一下: GetIPValue(IP: string): Cardinal;函数是取点分IP的数值型IP值的吗? 如果是的话,为什么不用Inet_addr()函数转化呢?而且发现GetIPValue的转化结果竟然跟Inet_addr()不一样!!!不知道创建QQwry数据格式的作者是怎么想的? 我没有深入地去看代码,说的不对的地方请见谅。 |