易语言纯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=65 F=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))

以上代码大家可以在易语言环境里测试下,感谢大家对我们的支持。

(0)

相关推荐

  • 易语言调用SetClipboardViewer的api实现剪贴版的内容监控

    DLL命令表 .版本 2 .DLL命令 加入剪贴板监视链_d, 整数型, "user32.dll", "SetClipboardViewer", 公开, 成功,返回值将标识剪贴板查看器链中的下一个窗口.如果出现错误或剪贴板查看器链中没有其他窗口,则返回值为空.( hwndNextViewer 将为 NULL.) .参数 窗口句柄, 整数型, , hwnd 加入剪切板监视链中窗口句柄 .DLL命令 设置窗口信息_d, 整数型, "user32",

  • 易语言获取外网ip方法

    看内容会很失望,让人hurt的易语言,没办法帮别人看一个易语言的程序,要添加这个东西,其实这是我第一次接触,然后修改和写易语言的程序. 代码如下: .版本 2 .子程序 取外网IP, 文本型, 公开, 取外网IP .局部变量 原文, 文本型 .局部变量 过度, 文本型, , "0" .局部变量 IP, 文本型 原文 = 到文本 (彗星HTTP读文件 ("http://www.ip138.com/ip2city.asp")) 过度 = 分割文本 (原文, "

  • 易语言破解WPS的VIP模版下载地址

    DLL命令表 .版本 2 .DLL命令 API下载文件, 整数型, "urlmon", "URLDownloadToFileA", , -下载文件 .参数 pcaller, 整数型 .参数 szurl, 文本型 .参数 szfilename, 文本型 .参数 dwreserved, 整数型 .参数 lpfncb, 整数型 常量数据表 .版本 2 .常量 id, "<文本长度: 21>", , "big":[{&qu

  • 易语言制作IP代理程序教学

    IP代理相信大家都比较了解,这里不废话了,这里用易语言制作的也是一个简单的IP代理,只能设置网页的代理,并不能进行全局的IP代理!IP通过网页进行获取! 1.打开易语言,新建windows窗口程序,简单做一个界面,这我们用一个超级列表框来显示获取到的IP 2.先看看采集IP的网址,这里选用快代理,好处就是自带了验证,所以写的软件就不带验证项了. 3.超级列表框设为报表,设置报表列,整行选择为真,显示格线为真! 4.因为用到正则,所以新建一个常量,用于存放匹配表达式,共进行了6处的匹配! 5.看代

  • 易语言调用百度API获取IP归属地的代码

    常量据表 .版本 2 .常量 查ip地址, "<文本长度: 17>", , {"code":0,"data": 调用百度api获取ip归属地的代码 此功能需要加载精易模块5.6 .版本 2 .程序集 窗口程序集_启动窗口 .子程序 取IP归属地_百度API, 文本型, 公开 .参数 IP地址, 文本型 .局部变量 Json, 类_json .局部变量 返回数据, 文本型 .局部变量 地区, 文本型 CoInitialize (0) 返

  • 易语言将指定的主机名与IP地址转换功能

    这个功能要用到以下几个命令: 转换为主机名命令 转换为IP地址命令 将指定的主机名转换为其 IP 地址,或将指定的 IP 地址转换为其主机名,如果失败返回空文本. 例程: 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想了解更多相关内容请查看下面相关链接

  • 易语言开发ip查看程序教学

    易语言开发ip查看程序,打开就可以看到本机的外网地址. 1.打开易语言程序,在程序菜单选择新建 windows窗口程序,适当的点击程序边角放大程序界面. 2.在工作夹找到标题项,更改程序的标题为 "ip查看". 3.在点击窗口组件箱中的基本组件中编辑框按钮,在程序界面上点击,放到合适的位置. 4.在点击窗口组件箱中的基本组件中标签按钮,在程序界面上点击,放到合适的位置.在工作夹找到标题项,更改标签的标题为 "IP". 5.在工作夹下方点击程序,双击模块引用表,找到准

  • 易语言纯IP数据库查询代码实例

    以下是我们给大家分享了易语言IP数据库查询相关的内容代码,大家可以测试下 .版本 2 .支持库 spec .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码 _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 (0) ' 可以根据您的需要返回任意数值 .子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中. ***注意不要修改本子程序的名称

  • 易语言使用倒找文本命令的代码实例

    倒找文本代码 .版本 2 .程序集 窗口程序集1 .子程序 _倒找文本按钮_被单击 .局部变量 获取字符, 整数型 .局部变量 获取文本内容, 文本型 获取字符 = 倒找文本 (路径编辑框.内容, "\", , 假) 获取文本内容 = 取文本右边 (路径编辑框.内容, 取文本长度 (路径编辑框.内容) - 获取字符) 文本名称编辑框.内容 = 获取文本内容 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如

  • Hibernate hql查询代码实例

    本文研究的主要是Hibernate hql查询的相关内容,具体如下. HQL介绍 Hibernate语言查询(Hibernate Query Language,HQL)它是完全面向对象的查询语句,查询功能非常强大:具备多态.关联等特性,HQL查询也是Hibernate官方推荐使用的查询方法. 下面我们通过一个案例我分析相关查询方法 Classes.java: public class Classes { /*班级ID*/ private int id; /*班级名称*/ private Stri

  • Java连接Mysql数据库详细代码实例

    这篇文章主要介绍了Java连接Mysql数据库详细代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 隔了一段时间没连过数据库,代码都忘记了,网上看了下挺乱的,还是自己记录下好.这里的代码主要是连接数据库和显示数据,没有具体的数据库操作. 首先第一步当然是导入mysql的jar包,在java文件中创一个新的文件夹,我这里命名为lib,然后把jar包复制进去 然后右键jar包,选择build path将包添加进库中 之后就是代码实现了 pac

  • C语言实现扫雷游戏详细代码实例

    扫雷游戏 思路:先制作一个菜单让玩家选择是玩游戏还是退出游戏,菜单做好了,接着我们开始制作扫雷的棋盘并初始化,初始化弄完了我们下一步开始埋雷,雷埋好了就开始扫雷. 大概思路就是这样具体实现看下面: 菜单的实现代码: int main() { int input = 0; srand((unsigned int)time(NULL)); do { printf("**************************\n"); printf("*** 1. play 0. exi

  • laravel join关联查询代码实例

    laravel join关联查询 1.两表关联 $fbaInventoryTb = (new \App\Model\Amz\Fba\InventoryReport)->getTable(); $productTb = (new \App\Model\Amz\Product)->getTable(); $twInventoryTb = (new \App\Model\TWUsa\TwusaInventory)->getTable(); $qry = \DB::table($fbaInven

  • R语言绘制饼状图代码实例

    R编程语言有许多库来创建图表和图表. 饼图是将值表示为具有不同颜色的圆的切片. 切片被标记,并且对应于每个片的数字也在图表中表示. 在R语言中,饼图是使用pie()函数创建的,它使用正数作为向量输入. 附加参数用于控制标签,颜色,标题等. 语法 使用R语言创建饼图的基本语法是 pie(x, labels, radius, main, col, clockwise) 以下是所使用的参数的描述 x是包含饼图中使用的数值的向量. labels用于给出切片的描述. radius表示饼图圆的半径(值-1和

  • 易语言操作EDB数据库的方法

    易语言自带的数据库EDB,操作很简单,其实他本身不能叫做数据库,实质只是一张数据表.没有SQLite那种支持SQL语句的操作数据库方便.不过,适合没有编程经验的新手学习和操作 1.打开易语言开发工具,点击菜单栏上"数据库->结构编辑器",弹出EDB的数据表设计界面.在里面添加字段名,类型,长度等信息,然后保存为一个文件 2.新建一个windows窗口工程. 3.在窗口创建完毕事件中添加连接查询edb的代码 4.可以在其他的子程序中,进行 "添加数据"的操作 5

  • PHP程序中使用adodb连接不同数据库的代码实例

    adodb.inc.php文件需要去下载一个adodb,放在相应的位置,然后在php中include进来就可以. 连接oracle数据库 <?php include("adodb/adodb.inc.php"); //包含adodb类库文件 $conn = &NewADOConnection('oci8'); $conn->Connect($DBServer,$DBUser,$DBPass); ?> 连接PostgreSQL数据库 <?php inclu

随机推荐