易语言读取QQWary地理位置方法
很多的功能需要查询IP地址的物理位置,这是一个前辈写好的子程序
使用方法:在自己的子程序中直接调用【IP查询(“IP地址”)即可,可以是变量】
.版本2 .程序集程序集_查询IP .子程序_启动子程序,整数型,,请在本子程序中放置易模块初始化代码 _查询IP()'在初始化代码执行完毕后调用测试代码 返回(0)'可以根据您的需要返回任意数值 .子程序_查询IP '本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。***注意不要修改本子程序的名称、参数及返回值类型。 '调试输出(IP查询(外网IP)) .子程序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) .子程序取地区文本,文本型 .参数文件号,整数型 .参数地区偏移,整数型 .局部变量首字节集,字节集 .局部变量偏移,整数型 .局部变量国家记录,文本型 .局部变量地区记录,文本型 .局部变量长度,整数型 '参考//www.nhooo.com/net/200504/4715.html 移动读写位置(文件号,,地区偏移) 首字节集=读入字节集(文件号,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) .计次循环尾() 返回(最终值)'本源码来自易语言资源网(www.5A5X.com) .子程序倒转十六进制文本,文本型 .参数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))
以上就是全部代码实例内容,需要的朋友们参考下。