易语言纯IP数据库查询代码实例
以下是我们给大家分享了易语言IP数据库查询相关的内容代码,大家可以测试下
.版本2
.支持库spec
.程序集程序集1
.子程序_启动子程序,整数型,,请在本子程序中放置易模块初始化代码
_临时子程序()'在初始化代码执行完毕后调用测试代码
返回(0)'可以根据您的需要返回任意数值
.子程序_临时子程序
'本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。***注意不要修改本子程序的名称、参数及返回值类型。
调试输出(查询IP归属地(“192.168.0.0”))
.子程序查询IP归属地,文本型,公开,查询IP地址的地理位置
.参数IP地址,文本型,,可以是域名
.参数数据库文件名,文本型,可空
.局部变量文件号,整数型
.局部变量文件头字节集,字节集
.局部变量IP数量,长整数型
.局部变量计次变量,整数型
.局部变量开始IP字节集,字节集
.局部变量结束IP偏移,长整数型
.局部变量结束IP字节集,字节集
.局部变量地区偏移,长整数型
.局部变量查询IP数值,长整数型
.局部变量地区文本,文本型
.局部变量IP段信息,文本型
.局部变量开始IP读取位置,长整数型
.局部变量开始ip,文本型
.局部变量结束IP,文本型
.局部变量first_start_ip_offset,长整数型
.局部变量last_start_ip_offset,长整数型
.局部变量开始IP数值,长整数型
.局部变量结束IP数值,长整数型
.如果真(IP地址=“”)
返回(“”)
.如果真结束
.如果真(是否为空(数据库文件名))
数据库文件名=“.\QQWry.dat”
.如果真结束
文件号=打开文件(数据库文件名,#读入,#无限制)
.如果真(文件号=0)
信息框(“没找到数据库”,0,,)
返回(“”)
.如果真结束
文件头字节集=读入字节集(文件号,8)
first_start_ip_offset=取字节集数据(取字节集左边(文件头字节集,4),#整数型,)
last_start_ip_offset=取字节集数据(取字节集右边(文件头字节集,4),#整数型,)
IP数量=(last_start_ip_offset-first_start_ip_offset)\7+1
查询IP数值=IP文本转整数值(IP地址)
开始IP读取位置=二分法确定位置(文件号,first_start_ip_offset,1,IP数量,查询IP数值)
移动读写位置(文件号,,first_start_ip_offset+(开始IP读取位置-1)×7)
开始IP字节集=读入字节集(文件号,7)
开始ip=IP文本补位(取十六进制文本(取字节集数据(取字节集左边(开始IP字节集,4),#整数型,)))
结束IP偏移=取字节集数据(取字节集右边(开始IP字节集,3),#整数型,)
移动读写位置(文件号,,结束IP偏移)
结束IP字节集=读入字节集(文件号,4)
结束IP=IP文本补位(取十六进制文本(取字节集数据(结束IP字节集,#整数型,)))
地区偏移=结束IP偏移+4
开始IP数值=十六进制到十进制(开始ip)
结束IP数值=十六进制到十进制(结束IP)
.如果真(查询IP数值≥开始IP数值且查询IP数值≤结束IP数值)
地区文本=取地区文本(文件号,地区偏移)
.如果真结束
关闭文件(文件号)
返回(地区文本)
.子程序二分法确定位置,整数型
.参数文件号,整数型
.参数基址,长整数型
.参数初始位置,长整数型
.参数结束位置,长整数型
.参数查询值,长整数型
.局部变量中间读写位置,长整数型
.局部变量中间位置,长整数型
.局部变量中间IP文本,文本型
.局部变量中间IP数值,长整数型
.局部变量结束读写位置,长整数型
.局部变量结束IP文本,文本型
.局部变量结束IP数值,长整数型
中间位置=(初始位置+结束位置)\2
.如果真(初始位置=中间位置)
返回(初始位置)
.如果真结束
结束读写位置=基址+(结束位置-1)×7
移动读写位置(文件号,,结束读写位置)
结束IP文本=IP文本补位(取十六进制文本(取字节集数据(取字节集左边(读入字节集(文件号,7),4),#整数型,)))
结束IP数值=十六进制到十进制(结束IP文本)
.如果真(查询值≥结束IP数值)
返回(结束位置)
.如果真结束
中间读写位置=基址+(中间位置-1)×7
移动读写位置(文件号,,中间读写位置)
中间IP文本=IP文本补位(取十六进制文本(取字节集数据(取字节集左边(读入字节集(文件号,7),4),#整数型,)))
中间IP数值=十六进制到十进制(中间IP文本)
.如果真(查询值<中间IP数值)
.如果真(结束位置-初始位置=1)
返回(初始位置)
.如果真结束
返回(二分法确定位置(文件号,基址,初始位置,中间位置,查询值))
.如果真结束
.如果真(查询值>中间IP数值)
返回(二分法确定位置(文件号,基址,中间位置,结束位置,查询值))
.如果真结束
.如果真(查询值=中间IP数值)
返回(中间位置)
.如果真结束
返回(0)
.子程序取地区文本,文本型
.参数文件号,整数型
.参数地区偏移,整数型
.局部变量首字节集,字节集
.局部变量偏移,整数型
.局部变量国家记录,文本型
.局部变量地区记录,文本型
.局部变量长度,整数型
移动读写位置(文件号,,地区偏移)
首字节集=读入字节集(文件号,1)
.判断开始(首字节集={1})'模式1的国家记录后面不会再有地区记录
偏移=取字节集数据(读入字节集(文件号,3),#整数型,)
国家记录=读国家记录(文件号,偏移,长度)
偏移=偏移+长度
地区记录=读地区记录(文件号,偏移)
.判断(首字节集={2})'模式2的国家记录后会有地区记录
偏移=取字节集数据(读入字节集(文件号,3),#整数型,)
国家记录=读国家记录(文件号,偏移,长度)
偏移=地区偏移+4
地区记录=读地区记录(文件号,偏移)
.默认
偏移=地区偏移
国家记录=读国家记录(文件号,偏移,长度)
偏移=偏移+长度
地区记录=读地区记录(文件号,偏移)
.判断结束
.如果真(到大写(删首尾空(地区记录))=“CZ88.NET”)
地区记录=“”
.如果真结束
.如果真(地区记录=“”且国家记录≠“”)
返回(国家记录)
.如果真结束
.如果真(地区记录≠“”且国家记录=“”)
返回(地区记录)
.如果真结束
.如果真(国家记录=地区记录)
返回(国家记录)
.如果真结束
返回(国家记录+“”+地区记录)
.子程序读国家记录,文本型
.参数文件号,整数型
.参数地区偏移,整数型
.参数长度,整数型,参考,记录所占的长度
.局部变量首字节集,字节集
.局部变量偏移,整数型
.局部变量国家记录,文本型
.局部变量记录长度,整数型
移动读写位置(文件号,#文件首,地区偏移)
首字节集=读入字节集(文件号,1)
.如果(首字节集={2})'第2次重定向一定是模式2
偏移=取字节集数据(读入字节集(文件号,3),#整数型,)
移动读写位置(文件号,#文件首,偏移)
首字节集=读入字节集(文件号,1)
.如果(首字节集={2}或首字节集={1})'可能有错误,不管了
偏移=取字节集数据(读入字节集(文件号,3),#整数型,)
移动读写位置(文件号,#文件首,偏移)
.否则
'不是重定向
移动读写位置(文件号,#现行位置,-1)'移动回去上面读过一字节数据了
.如果结束
国家记录=读入文本(文件号,)
长度=4
.否则
'不是重定向
移动读写位置(文件号,#现行位置,-1)'移动回去上面读过一字节数据了
国家记录=读入文本(文件号,)
记录长度=取文本长度(国家记录)
长度=记录长度+1
.如果结束
返回(国家记录)
.子程序读地区记录,文本型
.参数文件号,整数型
.参数地区偏移
.局部变量首字节集,字节集
.局部变量偏移,整数型
.局部变量地区记录,文本型
移动读写位置(文件号,#文件首,地区偏移)
首字节集=读入字节集(文件号,1)
.如果(首字节集={1}或首字节集={2})'对于地区记录,模式1和模式2是一样的
偏移=取字节集数据(读入字节集(文件号,3),#整数型,)
移动读写位置(文件号,#文件首,偏移)
首字节集=读入字节集(文件号,1)
.如果(首字节集={1}或首字节集={2})'再来判断下是否是重定向,安全第一
偏移=取字节集数据(读入字节集(文件号,3),#整数型,)
移动读写位置(文件号,#文件首,偏移)
.否则
'不是重定向
移动读写位置(文件号,#现行位置,-1)'移动回去上面读过一字节数据了
.如果结束
.否则
'不是重定向
移动读写位置(文件号,#现行位置,-1)'移动回去上面读过一字节数据了
.如果结束
地区记录=读入文本(文件号,)
返回(地区记录)
.子程序IP文本转整数值,长整数型
.参数IP文本,文本型
.局部变量IP变量数组,文本型,,"0"
.局部变量十六进制IP文本,文本型
.局部变量十进制值,长整数型
.局部变量新ip,文本型
.局部变量i,整数型
.局部变量IP段,文本型
IP变量数组=分割文本(IP文本,“.”,)
.如果真(取数组成员数(IP变量数组)≠4)
新ip=转换为IP地址(IP文本)
IP变量数组=分割文本(新ip,“.”,)
.如果真(取数组成员数(IP变量数组)≠4)
返回(0)
.如果真结束
.如果真结束
十六进制IP文本=“”
.计次循环首(4,i)
IP段=取文本右边(“00”+取十六进制文本(到整数(IP变量数组[5-i])),2)
十六进制IP文本=十六进制IP文本+IP段
.计次循环尾()
十进制值=十六进制到十进制(倒转十六进制文本(十六进制IP文本))
返回(十进制值)
.子程序十六进制到十进制,长整数型
.参数十六进制文本,文本型
.局部变量字节集,字节集
.局部变量字节集长度,整数型
.局部变量最终值,长整数型
.局部变量i,整数型,,,中间循环变量
.局部变量临时数值,整数型,,,每一位上的值
字节集=到字节集(到大写(十六进制文本))
字节集长度=取字节集长度(字节集)
.计次循环首(字节集长度,i)
临时数值=字节集[字节集长度-i+1]
.如果真(临时数值>64且临时数值<71)'A=65F=70
最终值=最终值+(临时数值-65+10)×求次方(16,i-1)
到循环尾()
.如果真结束
最终值=最终值+到整数(字符(临时数值))×求次方(16,i-1)
.计次循环尾()
返回(最终值)
.子程序倒转十六进制文本,文本型
.参数IP地址文本,文本型
.局部变量计次变量,整数型
.局部变量临时文本,文本型
.局部变量结果文本,文本型
临时文本=IP文本补位(IP地址文本)
.计次循环首(4,计次变量)
结果文本=结果文本+取文本中间(临时文本,8-计次变量×2+1,2)
.计次循环尾()
返回(结果文本)
.子程序IP文本补位,文本型
.参数IP地址文本,文本型
.局部变量文本长度,整数型
.局部变量临时文本,文本型
.局部变量计次变量,整数型
临时文本=IP地址文本
文本长度=取文本长度(IP地址文本)
.如果真(文本长度<8)
临时文本=取重复文本(8-文本长度,“0”)+临时文本
.如果真结束
返回(临时文本)
.子程序十六进制文本到IP地址,文本型
.参数IP文本,文本型
.局部变量临时文本,文本型
.局部变量结果文本,文本型
.局部变量计次变量,整数型
.局部变量结果ip,文本型,,"4"
.局部变量IP地址,文本型
临时文本=IP文本补位(IP文本)
.计次循环首(4,计次变量)
结果文本=取文本中间(临时文本,1+(计次变量-1)×2,2)
IP地址=IP地址+到文本(十六进制到十进制(结果文本))+“.”
.计次循环尾()
返回(取文本左边(IP地址,取文本长度(IP地址)-1))
以上代码大家可以在易语言环境里测试下,感谢大家对毛票票的支持。