VB如何用instr函数,从一个大的字节数组中查找特征字节串?比如从一个EXE文件中查找特征字串‘C7 EB FF’

由于EXE内容和特征字节串都是字节数据,直接当字符串查找会不会有问题?是否需要某种转换?比较晕,盼望指教!

VB和VBS函数 instr 函数
【名称】 InStr 【类别】 字符串函数 【方法】 InStr([start, ]string1, string2[, compare]) 【返回值】 返回 正整数Variant(Long)。 【异常/错误】 当string1为null时,产生 实时错误 '94' :无效使用Null 的错误 【描述】 返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中,从start开始找string2,省略start时从string1的第1个字符开始找。找不到时,函数返回值为0,找到则返回所在位置。 如果需要字节查找,则可以使用InstrB 【参数】 InStr 函数的语法具有下面的参数: 部分
编辑本段说明
start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。 string1 必要参数。接受搜索的字符串表达式。 string2 必要参数。被搜索的字符串表达式。 Compare 可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。 compare 参数设置为: 常数 值 vbUseCompareOption -1 说明:使用Option Compare 语句设置执行一个比较。 vbBinaryCompare 0 说明:执行一个二进制比较。 vbTextCompare 1 说明:执行一个按照原文的比较。 vbDatabaseCompare 2 说明:仅适用于Microsoft Access,执行一个基于数据库中信息的比较。

string1 必要参数。接受搜索的字符串表达式。 string2 必要参数。被搜索的字符串表达式。
只要文件作为一个字符串表达式参数就可以,至于exe文件应该也是可以的。
最好执行二进制比较,稳妥追问

将文件打开后所有内容赋给一个串?是条思路……

追答

我的思路:

从磁盘上找到文件地址,通过指针读取文件长度的字节作为字符串

本来想贴个源代码供你研究,不过超过字数限制了,给你链接请参考

http://zhidao.baidu.com/question/124326075.html?an=1&si=1

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-28
你所说的不是字符串吧,应该是二进制的数据,所以你用instr查找根本就不可行。这种情况可以考虑以二进制的方式打开文件,然后查找相关数据(可以自己编写程序查找)。至于转换我看就不必了,因为有些数据是无法转换成字符串的,而且你也不知道转换后的字符串是什么样子。追问

可是instrb貌似可以,而且instr如果不特别声明,默认好像就是字节方式吧?

追答

关于这两个函数的具体用法已经有朋友给出了,我就不再重复。我想强调的是,你要打开的是exe文件,是一个二进制文件,虽然里面也有文本信息,但如果你按照文本的方式打开,还是有很多字节无法转换为文本,另外,字符串结束的标志是"\0",而在二进制的文件中,这样的标志有很多,也就是说,你得到的字符串可能仅是文件的一部分。如果你实在不想用二进制的方式,那么你要确认你查找的内容在exe文件的哪个节内(参考exe文件格式),从相应的部分提取出文件的字符串资源,然后用字符串函数进行处理。

追问

有没有这样一个方法?
每个字节其实都是0-255,能否将字节数据就转换成这些数字组成的串,固定每个字节的长度为3为,不足的前面补零,这样可以准确定位了吧?或者就用16进制的2位,00~FF,把二进制内容当字符串存起来,要查找的二进制数据也就当成B$="C7EBFF"

我这么自找麻烦其实就是为了用Instr这个函数而已,快。我自己用二进制方式一个字节一个字节的比较早就做出来了,很慢。

追答

你的这个做法可以实现,其实也不用补什么0,就将字节转换为十六进制的字符串就可以了,前提是你以二进制的方式获得内容,然后逐字节转换。不过这样做比用二进制查找更浪费时间。是不是有别的更好的方法,我还真不是很清楚,因为你要求用instr这个函数。

本回答被提问者采纳

VB如何用instr函数,从一个大的字节数组中查找特征字节串?比如从一个...
在字符串string1中,从start开始找string2,省略start时从string1的第1个字符开始找。找不到时,函数返回值为0,找到则返回所在位置。 如果需要字节查找,则可以使用InstrB 【参数】 InStr 函数的语法具有下面的参数: 部分 编辑本段说明 start 可选参数。为数值表达式,设置每次搜索的起...

ASP怎样将文本(string)转为字节(byte)数组
VB的做法:首先得到这个字符串的个数,将这个字符串分割成单个字符存储到一个数组中,然后将数组转换到另一个数组,得到这个数组的ANSI字符代码即可。下面是实现代码:Private Sub Command1_Click()If Text1.Text = "" Then '判断字符串是否为空 MsgBox "请输入需要转换的字符串!" Exit Su...

VB字符串和字节数组的转换
1. 函数预先要求你提供一个有固定空间的字符串,以供存储函数的返回值。2. 函数的返回是一个以Null结尾的C字符串,而不是正规的VB字符串。3. Win32 API函数有时候会返回另一种类型的字符串。这种类型的字符串在单个缓冲区内保存了多个字符串值,每个值之间用Null隔开,结尾的是两个Null,一个Null...

求教VB6.0关于BASE64加密算法错误问题
Public Function DecodeBase64String(str2Decode As String) As String DecodeBase64String = StrConv(DecodeBase64Byte(str2Decode), vbUnicode)End Function '从一个经过Base64的字符串中解码到源字节数组 Public Function DecodeBase64Byte(str2Decode As String) As Byte()Dim lPtr As Long Dim...

asp是什么?
该函数返回值为“1”到“7”,分别代表“星期日”、“星期一”……“星期六”。比如当返回值是“4”时就表示“星期三”。(11)WeekDayName函数:返回一个星期中具体某天的字符串。相对weekday函数而言即翻译出“星期几”,使用方法:weekdayname(weekday)。参数weekday即星期中具体某天的数值。比如“weekdayname(...

相似回答
大家正在搜