• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >易语言 > 易语言纯IP数据库查询代码实例

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

作者:易语言帮助手册 字体:[增加 减小] 来源:互联网 时间:2018-11-19

易语言帮助手册通过本文主要向大家介绍了易语言,IP等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

以下是我们给大家分享了易语言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))

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

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解易语言写ec模块的方法
  • 简单的易语言多线程应用实例
  • 易语言修改IE协议头留言手机版网页
  • 易语言拖放对象组件应用详解
  • 易语言dll文件传递字节集参数解析
  • 易语言目录框的目录被改变后取得改变后的目录并在编辑框中显示
  • 易语言操作硬盘txt扫描删除
  • 易语言模拟客户组件post发送数据
  • 易语言BUG及解决办法
  • 易语言设置在驱动器框中显示指定的驱动器类型

相关文章

  • 2018-11-19易语言将十进制数值转换为八进制文本的方法
  • 2018-11-19易语言在画板中画指定样式饼形的方法
  • 2017-05-28易语言键盘代码一览表
  • 2017-05-28详解易语言中的数据类型
  • 2018-11-19易语言设置当前程序到系统托盘中的方法
  • 2018-11-19零基础易语言入门教程(二)之编程思路
  • 2018-11-19一步一步跟我学易语言之自定义数据类型
  • 2018-11-19易语言取文本左右及中间指定长度的文本内容
  • 2018-11-19易语言通过现行选中项设置标签背景颜色的排列方式
  • 2018-11-19易语言设置画板绘画时的画笔类型

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 易语言四舍五入命令使用讲解
    • 易语言在组合框中寻找包含指定文本的项目
    • 详解易语言DLL以及API函数
    • 用易语言开发Linux程序的方法
    • 易语言设置按钮背景显示指定的图片
    • 一步一步跟我学易语言之关于数组
    • 易语言修改窗口的背景图片与显示方式
    • 编写高质量易语言代码注意点
    • 易语言在画板中使用写出命令讲解
    • 易语言显示与隐藏窗口的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有