为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 易语言相关 > 易语言例程 正文

易语言寻找字节集通配符源码

三叶资源网 2015-03-14 17:01:18 易语言例程 2706 ℃ 1 评论

易语言寻找字节集通配符源码

@资源源码站

.版本 2

.程序集 程序集1

.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码
.局部变量 临_字节集, 字节集
.局部变量 临_开始时间, 整数型
.局部变量 临_位置, 整数型
.局部变量 计次, 整数型

临_字节集 = 取空白字节集 (599999999) + { 3, 2, 1 }
.计次循环首 (599999999, 计次)
    临_字节集 [计次] = 计次
.计次循环尾 ()
临_开始时间 = 取启动时间 ()
临_位置 = 寻找字节集_通配符 (临_字节集, “03??01”)
输出调试文本 (“通配符_搜索         ” + “位置:” + 到文本 (临_位置) + “  耗时:” + 到文本 (取启动时间 () - 临_开始时间))
临_开始时间 = 取启动时间 ()
临_位置 = 寻找字节集_通配符 (临_字节集, “030201”)
输出调试文本 (“速度比较_通配符     ” + “位置:” + 到文本 (临_位置) + “  耗时:” + 到文本 (取启动时间 () - 临_开始时间))
临_开始时间 = 取启动时间 ()
临_位置 = 寻找字节集 (临_字节集, { 3, 2, 1 }, )
输出调试文本 (“速度比较_搜索字节集 ” + “位置:” + 到文本 (临_位置) + “  耗时:” + 到文本 (取启动时间 () - 临_开始时间))
' 老方法
临_开始时间 = 取启动时间 ()
临_位置 = 寻找字节集_老的仅供参考学习 (临_字节集, “030201”)
输出调试文本 (“老方法搜索仅供参考  ” + “位置:” + 到文本 (临_位置) + “  耗时:” + 到文本 (取启动时间 () - 临_开始时间))
返回 (0)  ' 返回值被忽略。

.子程序 寻找字节集_通配符, 整数型, , 返回一字节集在另一字节集中最先出现的位置,位置值从 1 开始。如果未找到,返回 -1  by zhangyun173
.参数 被搜寻的字节集, 字节集
.参数 欲寻找的字节集, 文本型, , 不一样了可以带*或?号代替如"FF**AA??02"16进制,别搞错了2个字符为1个字节,1必须写成01,长度不要超过255个字节了
.参数 起始搜寻位置, 整数型, 可空, 可以被省略。1为首位置,2为第2个位置,如此类推,如果被省略,则“寻找字节集”命令默认从首部开始,“倒找字节集”命令默认从尾部开始
.局部变量 临_数据地址, 整数型
.局部变量 临_数据大小, 整数型
.局部变量 临_搜索地址, 整数型
.局部变量 临_寻找的字节集, 字节集
.局部变量 临_匹配内容, 文本型
.局部变量 临_文本, 文本型
.局部变量 临_位置, 整数型

.如果真 (是否为空 (起始搜寻位置))
    起始搜寻位置 = 1
.如果真结束
临_数据地址 = 取字节集指针 (被搜寻的字节集) + 起始搜寻位置 - 1
临_数据大小 = 取字节集长度 (被搜寻的字节集) - 起始搜寻位置 + 1
临_搜索地址 = 1
临_匹配内容 = 删全部空 (欲寻找的字节集)
.如果真 (取文本长度 (临_匹配内容) % 2 ≠ 0)  ' 搜索的字节集错误
    返回 (-1)
.如果真结束
.如果真 (取文本长度 (临_匹配内容) ÷ 2 > 临_数据大小)  ' 搜索内容大于被搜索的内容,没的找。
    返回 (-1)
.如果真结束
.如果真 (取文本长度 (临_匹配内容) ÷ 2 > 255)  ' 搜索内容大于255,自个升级吧。
    返回 (-1)
.如果真结束
临_位置 = -1
.判断循环首 (临_匹配内容 ≠ “”)
    临_文本 = 取文本左边 (临_匹配内容, 2)
    .如果真 (取反 (临_文本 = “**” 或 临_文本 = “??”))
        临_寻找的字节集 = 临_寻找的字节集 + 到字节集 (到字节 (临_位置)) + 到字节集 (到字节 (十六到十 (临_文本)))
    .如果真结束
    临_位置 = 临_位置 + 1
    临_匹配内容 = 文本替换 (临_匹配内容, 1, 2, )
.判断循环尾 ()
临_搜索地址 = 取字节集指针 (临_寻找的字节集)
置入代码 ({ 139, 125, 252, 139, 77, 248, 139, 117, 244, 139, 86, 252, 51, 192, 138, 70, 1, 242, 174, 117, 28, 187, 2, 0, 0, 0, 51, 192, 138, 4, 30, 138, 4, 7, 58, 68, 30, 1, 117, 228, 131, 195, 2, 59, 218, 115, 13, 235, 233, 184, 255, 255, 255, 255, 139, 229, 93, 194, 10, 0, 43, 125, 252, 137, 125, 252 })
返回 (临_数据地址 + 起始搜寻位置 - 1)
' mov edi,[ebp-4]
' mov ecx,[ebp-8]
' mov esi,[ebp-12]
' mov edx,[esi-4]
' @for:;循环
' xor eax,eax
' mov al,[esi+1]
' repne scasb
' jnz @over;搜索完成跳到失败
' mov ebx,2
' @for2:;子循环
' xor eax,eax
' mov al,[ebx+esi]
' mov al,[eax+edi]
' cmp al,[ebx+esi+1]
' jnz @for;得,子循环比较失败,白跑了,继续下一个循环。
' add ebx,2
' cmp ebx,edx
' jnb @end;比较完成成功了
' jmp @for2;子循环继续
' @over:;失败
' mov eax,-1
' mov esp,ebp
' pop ebp
' retn 10
' @end:;成功
' sub edi,[ebp-4]
' mov [ebp-4],edi

.子程序 寻找字节集_老的仅供参考学习, 整数型, , 返回一字节集在另一字节集中最先出现的位置,位置值从 1 开始。如果未找到,返回 -1 by zhangyun173
.参数 被搜寻的字节集, 字节集
.参数 欲寻找的字节集, 文本型, , 不一样了可以带*或?号代替如"FF**AA??02"16进制,别搞错了2个字符为1个字节,1必须写成01
.参数 起始搜寻位置, 整数型, 可空, 可以被省略。1为首位置,2为第2个位置,如此类推,如果被省略,则“寻找字节集”命令默认从首部开始,“倒找字节集”命令默认从尾部开始
.局部变量 临_数据地址, 整数型
.局部变量 临_数据大小, 整数型
.局部变量 临_搜索地址, 整数型
.局部变量 临_寻找的字节集, 字节集
.局部变量 临_匹配内容, 文本型
.局部变量 临_文本, 文本型
.局部变量 临_位置, 整数型

.如果真 (是否为空 (起始搜寻位置))
    起始搜寻位置 = 1
.如果真结束
临_数据地址 = 取字节集指针 (被搜寻的字节集) + 起始搜寻位置 - 1
临_数据大小 = 取字节集长度 (被搜寻的字节集) - 起始搜寻位置 + 1
临_搜索地址 = 1
临_匹配内容 = 删全部空 (欲寻找的字节集)
.如果真 (取文本长度 (临_匹配内容) % 2 ≠ 0)  ' 搜索的字节集错误
    返回 (-1)
.如果真结束
.如果真 (取文本长度 (临_匹配内容) ÷ 2 > 临_数据大小)  ' 搜索内容大于被搜索的内容,没的找。
    返回 (-1)
.如果真结束
.判断循环首 (临_匹配内容 ≠ “”)
    临_文本 = 取文本左边 (临_匹配内容, 2)
    .如果真 (取反 (临_文本 = “**” 或 临_文本 = “??”))
        临_寻找的字节集 = 临_寻找的字节集 + 到字节集 (到字节 (临_位置)) + 到字节集 (到字节 (十六到十 (临_文本)))
    .如果真结束
    临_位置 = 临_位置 + 1
    临_匹配内容 = 文本替换 (临_匹配内容, 1, 2, )
.判断循环尾 ()
临_搜索地址 = 取字节集指针 (临_寻找的字节集)
置入代码 ({ 139, 117, 252, 139, 77, 248, 3, 206, 139, 125, 244, 139, 87, 252, 51, 192, 51, 219, 138, 4, 59, 138, 4, 48, 58, 68, 59, 1, 117, 9, 131, 195, 2, 59, 218, 115, 20, 235, 235, 59, 241, 115, 3, 70, 235, 224, 184, 255, 255, 255, 255, 139, 229, 93, 194, 16, 0, 43, 117, 252, 137, 117, 252 })
返回 (临_数据地址 + 起始搜寻位置)
' ;数据初始化
' mov esi,[ebp-4];数据地址
' mov ecx,[ebp-8];数据大小
' add ecx,esi;数据结束地址
' mov edi,[ebp-12];搜索数据地址
' mov edx,[edi-4];搜索数据大小
' ;循环开始
' @for1:
' xor eax,eax
' xor ebx,ebx;清零搜索数据计次
' @for2:
' mov al,[edi+ebx];取出搜索数据中的一个字节(字节集位置)
' mov al,[esi+eax];取出数据中的一个字节进行比较
' cmp al,[edi+ebx+1]
' jnz @next1;不相等跳出子循环,数据+1继续
' add ebx,2
' cmp ebx,edx;比较搜索大小,和已完成搜索的大小
' jae @end;大于等于时子循环搜索完成,找到符合条件的
' jmp @for2
' @next1:
' cmp esi,ecx
' jae @over;整个数据搜索完成,失败了。
' inc esi;数据+1继续循环
' jmp @for1
' @over:;失败
' mov eax,-1
' mov esp,ebp
' pop ebp
' retn 16
' @end:;成功
' sub esi,[ebp-4]
' mov [ebp-4],esi


.子程序 取字节集指针, 整数型
.参数 字节集, 字节集

置入代码 ({ 139, 69, 8, 139, 0, 131, 192, 8, 201, 194, 4, 0 })
' mov eax, dword ptr [ebp+08]
' mov eax, dword ptr [eax]
' add eax, 00000008
' leave
' ret 0004
返回 (0)

.子程序 十六到十, 整数型, , 将十六进制转换成十进制(返回十进制文本)
.参数 十六进制文本, 文本型, , 待转换的十六进制文本
.参数 返回结果, 文本型, 参考 可空, 返回文本结果(如十进制数超出整数范围,可通过返回结果获得十进制文本)
.局部变量 中间文本, 文本型
.局部变量 结果, 长整数型
.局部变量 容器1, 整数型

返回结果 = “”
.变量循环首 (1, 取文本长度 (十六进制文本), 1, 容器1)
    中间文本 = 取文本中间 (十六进制文本, 容器1, 1)
    结果 = (寻找文本 (“0123456789ABCDEF”, 中间文本, , 真) - 1) × 求次方 (16, 取文本长度 (十六进制文本) - 容器1) + 结果
.变量循环尾 ()
.如果真 (是否为空 (返回结果) = 假)
    返回结果 = 到文本 (结果)
.如果真结束
返回 (结果)
文件下载

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

已有1位网友发表了看法:

  • yiyuyan

    yiyuyan  评论于 [2021-05-13 23:29:44]  回复

    易语言通配符寻找字节集

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
BAT批处理变量数据交换动画框应用例程短信轰炸机网易登录音频文件断点下载SendMessage车牌识别office2019激活炫彩界面库模块加密壳微信域名拦截二维码识别模拟系列教程网易云微博引流node模块EXUI例程聚享游
最新评论