易语言 - 模块 - 子程序 - 纯真IP数据库查询
- .版本
- .支持库 spec
- .程序集 程序集1
- .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码
- _临时子程序 () ' 在初始化代码执行完毕后调用测试代码
- 返回 () ' 可以根据您的需要返回任意数值
- .子程序 _临时子程序
- ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
- 调试输出 (查询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”
- .如果真结束
- 文件号 = 打开文件 (数据库文件名, #读入, #无限制)
- .如果真 (文件号 = )
- 信息框 (“没找到数据库”, , , )
- 返回 (“”)
- .如果真结束
- 文件头字节集 = 读入字节集 (文件号, )
- first_start_ip_offset = 取字节集数据 (取字节集左边 (文件头字节集, ), #整数型, )
- last_start_ip_offset = 取字节集数据 (取字节集右边 (文件头字节集, ), #整数型, )
- IP数量 = (last_start_ip_offset - first_start_ip_offset) \ +
- 查询IP数值 = IP文本转整数值 (IP地址)
- 开始IP读取位置 = 二分法确定位置 (文件号, first_start_ip_offset, , IP数量, 查询IP数值)
- 移动读写位置 (文件号, , first_start_ip_offset + (开始IP读取位置 - ) × )
- 开始IP字节集 = 读入字节集 (文件号, )
- 开始ip = IP文本补位 (取十六进制文本 (取字节集数据 (取字节集左边 (开始IP字节集, ), #整数型, )))
- 结束IP偏移 = 取字节集数据 (取字节集右边 (开始IP字节集, ), #整数型, )
- 移动读写位置 (文件号, , 结束IP偏移)
- 结束IP字节集 = 读入字节集 (文件号, )
- 结束IP = IP文本补位 (取十六进制文本 (取字节集数据 (结束IP字节集, #整数型, )))
- 地区偏移 = 结束IP偏移 +
- 开始IP数值 = 十六进制到十进制 (开始ip)
- 结束IP数值 = 十六进制到十进制 (结束IP)
- .如果真 (查询IP数值 ≥ 开始IP数值 且 查询IP数值 ≤ 结束IP数值)
- 地区文本 = 取地区文本 (文件号, 地区偏移)
- .如果真结束
- 关闭文件 (文件号)
- 返回 (地区文本)
- .子程序 二分法确定位置, 整数型
- .参数 文件号, 整数型
- .参数 基址, 长整数型
- .参数 初始位置, 长整数型
- .参数 结束位置, 长整数型
- .参数 查询值, 长整数型
- .局部变量 中间读写位置, 长整数型
- .局部变量 中间位置, 长整数型
- .局部变量 中间IP文本, 文本型
- .局部变量 中间IP数值, 长整数型
- .局部变量 结束读写位置, 长整数型
- .局部变量 结束IP文本, 文本型
- .局部变量 结束IP数值, 长整数型
- 中间位置 = (初始位置 + 结束位置) \
- .如果真 (初始位置 = 中间位置)
- 返回 (初始位置)
- .如果真结束
- 结束读写位置 = 基址 + (结束位置 - ) ×
- 移动读写位置 (文件号, , 结束读写位置)
- 结束IP文本 = IP文本补位 (取十六进制文本 (取字节集数据 (取字节集左边 (读入字节集 (文件号, ), ), #整数型, )))
- 结束IP数值 = 十六进制到十进制 (结束IP文本)
- .如果真 (查询值 ≥ 结束IP数值)
- 返回 (结束位置)
- .如果真结束
- 中间读写位置 = 基址 + (中间位置 - ) ×
- 移动读写位置 (文件号, , 中间读写位置)
- 中间IP文本 = IP文本补位 (取十六进制文本 (取字节集数据 (取字节集左边 (读入字节集 (文件号, ), ), #整数型, )))
- 中间IP数值 = 十六进制到十进制 (中间IP文本)
- .如果真 (查询值 < 中间IP数值)
- .如果真 (结束位置 - 初始位置 = )
- 返回 (初始位置)
- .如果真结束
- 返回 (二分法确定位置 (文件号, 基址, 初始位置, 中间位置, 查询值))
- .如果真结束
- .如果真 (查询值 > 中间IP数值)
- 返回 (二分法确定位置 (文件号, 基址, 中间位置, 结束位置, 查询值))
- .如果真结束
- .如果真 (查询值 = 中间IP数值)
- 返回 (中间位置)
- .如果真结束
- 返回 ()
- .子程序 取地区文本, 文本型
- .参数 文件号, 整数型
- .参数 地区偏移, 整数型
- .局部变量 首字节集, 字节集
- .局部变量 偏移, 整数型
- .局部变量 国家记录, 文本型
- .局部变量 地区记录, 文本型
- .局部变量 长度, 整数型
- 移动读写位置 (文件号, , 地区偏移)
- 首字节集 = 读入字节集 (文件号, )
- .判断开始 (首字节集 = { }) ' 模式1的国家记录后面不会再有地区记录
- 偏移 = 取字节集数据 (读入字节集 (文件号, ), #整数型, )
- 国家记录 = 读国家记录 (文件号, 偏移, 长度)
- 偏移 = 偏移 + 长度
- 地区记录 = 读地区记录 (文件号, 偏移)
- .判断 (首字节集 = { }) ' 模式2的国家记录后会有地区记录
- 偏移 = 取字节集数据 (读入字节集 (文件号, ), #整数型, )
- 国家记录 = 读国家记录 (文件号, 偏移, 长度)
- 偏移 = 地区偏移 +
- 地区记录 = 读地区记录 (文件号, 偏移)
- .默认
- 偏移 = 地区偏移
- 国家记录 = 读国家记录 (文件号, 偏移, 长度)
- 偏移 = 偏移 + 长度
- 地区记录 = 读地区记录 (文件号, 偏移)
- .判断结束
- .如果真 (到大写 (删首尾空 (地区记录)) = “CZ88.NET”)
- 地区记录 = “”
- .如果真结束
- .如果真 (地区记录 = “” 且 国家记录 ≠ “”)
- 返回 (国家记录)
- .如果真结束
- .如果真 (地区记录 ≠ “” 且 国家记录 = “”)
- 返回 (地区记录)
- .如果真结束
- .如果真 (国家记录 = 地区记录)
- 返回 (国家记录)
- .如果真结束
- 返回 (国家记录 + “ ” + 地区记录)
- .子程序 读国家记录, 文本型
- .参数 文件号, 整数型
- .参数 地区偏移, 整数型
- .参数 长度, 整数型, 参考, 记录所占的长度
- .局部变量 首字节集, 字节集
- .局部变量 偏移, 整数型
- .局部变量 国家记录, 文本型
- .局部变量 记录长度, 整数型
- 移动读写位置 (文件号, #文件首, 地区偏移)
- 首字节集 = 读入字节集 (文件号, )
- .如果 (首字节集 = { }) ' 第2次重定向一定是模式2
- 偏移 = 取字节集数据 (读入字节集 (文件号, ), #整数型, )
- 移动读写位置 (文件号, #文件首, 偏移)
- 首字节集 = 读入字节集 (文件号, )
- .如果 (首字节集 = { } 或 首字节集 = { }) ' 可能有错误,不管了
- 偏移 = 取字节集数据 (读入字节集 (文件号, ), #整数型, )
- 移动读写位置 (文件号, #文件首, 偏移)
- .否则
- ' 不是重定向
- 移动读写位置 (文件号, #现行位置, -) ' 移动回去 上面读过一字节数据了
- .如果结束
- 国家记录 = 读入文本 (文件号, )
- 长度 =
- .否则
- ' 不是重定向
- 移动读写位置 (文件号, #现行位置, -) ' 移动回去 上面读过一字节数据了
- 国家记录 = 读入文本 (文件号, )
- 记录长度 = 取文本长度 (国家记录)
- 长度 = 记录长度 +
- .如果结束
- 返回 (国家记录)
- .子程序 读地区记录, 文本型
- .参数 文件号, 整数型
- .参数 地区偏移
- .局部变量 首字节集, 字节集
- .局部变量 偏移, 整数型
- .局部变量 地区记录, 文本型
- 移动读写位置 (文件号, #文件首, 地区偏移)
- 首字节集 = 读入字节集 (文件号, )
- .如果 (首字节集 = { } 或 首字节集 = { }) ' 对于地区记录,模式1和模式2是一样的
- 偏移 = 取字节集数据 (读入字节集 (文件号, ), #整数型, )
- 移动读写位置 (文件号, #文件首, 偏移)
- 首字节集 = 读入字节集 (文件号, )
- .如果 (首字节集 = { } 或 首字节集 = { }) ' 再来判断下是否是重定向,安全第一
- 偏移 = 取字节集数据 (读入字节集 (文件号, ), #整数型, )
- 移动读写位置 (文件号, #文件首, 偏移)
- .否则
- ' 不是重定向
- 移动读写位置 (文件号, #现行位置, -) ' 移动回去 上面读过一字节数据了
- .如果结束
- .否则
- ' 不是重定向
- 移动读写位置 (文件号, #现行位置, -) ' 移动回去 上面读过一字节数据了
- .如果结束
- 地区记录 = 读入文本 (文件号, )
- 返回 (地区记录)
- .子程序 IP文本转整数值, 长整数型
- .参数 IP文本, 文本型
- .局部变量 IP变量数组, 文本型, , ""
- .局部变量 十六进制IP文本, 文本型
- .局部变量 十进制值, 长整数型
- .局部变量 新ip, 文本型
- .局部变量 i, 整数型
- .局部变量 IP段, 文本型
- IP变量数组 = 分割文本 (IP文本, “.”, )
- .如果真 (取数组成员数 (IP变量数组) ≠ )
- 新ip = 转换为IP地址 (IP文本)
- IP变量数组 = 分割文本 (新ip, “.”, )
- .如果真 (取数组成员数 (IP变量数组) ≠ )
- 返回 ()
- .如果真结束
- .如果真结束
- 十六进制IP文本 = “”
- .计次循环首 (, i)
- IP段 = 取文本右边 (“” + 取十六进制文本 (到整数 (IP变量数组 [ - i])), )
- 十六进制IP文本 = 十六进制IP文本 + IP段
- .计次循环尾 ()
- 十进制值 = 十六进制到十进制 (倒转十六进制文本 (十六进制IP文本))
- 返回 (十进制值)
- .子程序 十六进制到十进制, 长整数型
- .参数 十六进制文本, 文本型
- .局部变量 字节集, 字节集
- .局部变量 字节集长度, 整数型
- .局部变量 最终值, 长整数型
- .局部变量 i, 整数型, , , 中间循环变量
- .局部变量 临时数值, 整数型, , , 每一位上的值
- 字节集 = 到字节集 (到大写 (十六进制文本))
- 字节集长度 = 取字节集长度 (字节集)
- .计次循环首 (字节集长度, i)
- 临时数值 = 字节集 [字节集长度 - i + ]
- .如果真 (临时数值 > 且 临时数值 < ) ' A=65 F=70
- 最终值 = 最终值 + (临时数值 - + ) × 求次方 (, i - )
- 到循环尾 ()
- .如果真结束
- 最终值 = 最终值 + 到整数 (字符 (临时数值)) × 求次方 (, i - )
- .计次循环尾 ()
- 返回 (最终值)
- .子程序 倒转十六进制文本, 文本型
- .参数 IP地址文本, 文本型
- .局部变量 计次变量, 整数型
- .局部变量 临时文本, 文本型
- .局部变量 结果文本, 文本型
- 临时文本 = IP文本补位 (IP地址文本)
- .计次循环首 (, 计次变量)
- 结果文本 = 结果文本 + 取文本中间 (临时文本, - 计次变量 × + , )
- .计次循环尾 ()
- 返回 (结果文本)
- .子程序 IP文本补位, 文本型
- .参数 IP地址文本, 文本型
- .局部变量 文本长度, 整数型
- .局部变量 临时文本, 文本型
- .局部变量 计次变量, 整数型
- 临时文本 = IP地址文本
- 文本长度 = 取文本长度 (IP地址文本)
- .如果真 (文本长度 < )
- 临时文本 = 取重复文本 ( - 文本长度, “”) + 临时文本
- .如果真结束
- 返回 (临时文本)
- .子程序 十六进制文本到IP地址, 文本型
- .参数 IP文本, 文本型
- .局部变量 临时文本, 文本型
- .局部变量 结果文本, 文本型
- .局部变量 计次变量, 整数型
- .局部变量 结果ip, 文本型, , ""
- .局部变量 IP地址, 文本型
- 临时文本 = IP文本补位 (IP文本)
- .计次循环首 (, 计次变量)
- 结果文本 = 取文本中间 (临时文本, + (计次变量 - ) × , )
- IP地址 = IP地址 + 到文本 (十六进制到十进制 (结果文本)) + “.”
- .计次循环尾 ()
- 返回 (取文本左边 (IP地址, 取文本长度 (IP地址) - ))
易语言 - 模块 - 子程序 - 纯真IP数据库查询的更多相关文章
- python3通过纯真IP数据库查询IP归属地信息
在网上看到的别人写的python2的代码,修改成了python3. 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下. #! /usr/bin/env python # -*- co ...
- 【VB.NET】利用纯真IP数据库查询IP地址及信息
几年前从某个博客抄来的,已经忘记原地址了,如果需要C#版的,可以在博客园搜到吧.我因为自己用,所以转换为了VBNET代码,而且也放置了很久,今天无意间翻出来,就分享给大家吧. 首先,先下载 纯真数据库 ...
- PHP利用纯真IP数据库在本地实现IP地址信息查询
https://blog.csdn.net/myweishanli/article/details/45098693 准备工作: 建议本地IP地址数据库,请到http://www.cz88.net/这 ...
- 优化读取纯真IP数据库QQWry.dat获取地区信息
改自HeDaode 2007-12-28的代码 将之改为从硬盘读取后文件后,将MemoryStream放到内存中,提高后续查询速度 ///<summary> /// 提供从纯真IP数据库搜 ...
- 纯真IP数据库导入mysql
下载纯真IP数据库 安装后解压到本地为ip.txt 格式为: 1.1.145.0 1.1.147.255 泰国 沙功那空 1.1.148.0 1.1.149.255 ...
- 纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat) 转载自:http://blog.cafeboy.org/2011/02/25/qqwry-to-ipwry/ ht ...
- PHP调用纯真IP数据库返回具体地址
function convertip($ip) { $ip1num = 0; $ip2num = 0; $ipAddr1 =""; $ipAddr2 =""; ...
- 用纯真ip数据库.dat文件查询ip归属
网址:http://www.cz88.net/ 下载安装后,有这个文件: 安装路径/ip/qqwry.dat 创建实例的时候吧这个文件路径传入,即可调用. /** * 从纯真IP地址库查询ip归属 * ...
- PHP获取IP及地区信息(纯真IP数据库)
昨天在写程序的时候,发现在用户的时候记录IP和地区信息也许以后用得上,去网上找了找,发现实现的方式有好多好多,因为我用的ThinkPHP,后来又去TP官网找了找,最后采用了下面这种方法. <?p ...
随机推荐
- Django-CSRF的使用
1. 为什么要有csrf_token? 防止跨站请求伪造 2. Django中如何使用? urls.py: urlpatterns = [ # 测试跨站请求伪造 (CSRF) url(r'^csrf_ ...
- POJ-3450 Corporate Identity (KMP+后缀数组)
Description Beside other services, ACM helps companies to clearly state their “corporate identity”, ...
- wpf 实现 css3 中 boxshadow inset 效果
using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.W ...
- vue页面传值
第一种情况:例:消息列表页(路由)跳转: methods: { goTo(){ this.$router.push({ name:'/My/Info', query:{ 'tellSeq':this. ...
- 二叉树之AVL树
高度为 h 的 AVL 树,节点数 N 最多2^h − 1: 最少N(h)=N(h− 1) +N(h− 2) + 1. 最少节点数n 如以斐波那契数列可以用数学归纳法证明: 即: N(0) = 0 ( ...
- 总结const、readonly、static三者的区别
const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编译时常量的原因是它编译时会将其替换为所对应的值: b.静态 ...
- WinHex18.4算法分析
经过分析,注册码分为六个部分: Name: "xxx" Addr1: "yyy" Addr2: "zzz" 这三个字符不代表长度 Key1: ...
- work2:贪吃蛇
学号:2017*****7219 姓名:邰嘉琛我的码云贪吃蛇项目仓库:https://gitee.com/tjc666/sesnake/tree/master2) 给出你的各项任务完成时间估算与实际消 ...
- 关于GitHub
gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub 对于程序员来说就相当于一个仓库可以把自己写的东西放到网上 要想使用GitHub必须 ...
- python之路-----前端之js(一)
一.JS发展历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Netscape ...