我做的是一个修复 被病毒感染的文件 的工具
被病毒感染的文件 末尾是特定的字符串,我要用正则表达式匹配到但是为了不破坏原来的文件,所以只能以二进制读取,这就带来一系列的问题:
比如:
1·byte数组怎么匹配到那个字符串
2·修改后怎么回写到原来的文件中我目前没有好的想法,主要卡在“用VB 修改二进制文件,并且匹配二进制文件中的字符串”
我这两天已经百度了不下几百页了,还是没方案
真诚等到高人的出现,有例子就更好啦
被病毒感染的文件 末尾是特定的字符串,我要用正则表达式匹配到但是为了不破坏原来的文件,所以只能以二进制读取,这就带来一系列的问题:
比如:
1·byte数组怎么匹配到那个字符串
2·修改后怎么回写到原来的文件中我目前没有好的想法,主要卡在“用VB 修改二进制文件,并且匹配二进制文件中的字符串”
我这两天已经百度了不下几百页了,还是没方案
真诚等到高人的出现,有例子就更好啦
解决方案 »
- WIN7下使用API gethostbyname 返回值为0
- 如何用VB实现自动发邮件
- 怎样在inputbox()里输入中文?
- 如何用API代替OLE Automation的功能?
- 那里可以下载到xp的皮肤(包括标题栏,边框等)
- 请教高手,如下是乱码还是源代码被加密还是什么其他原因??一定高分想送
- 希望高手进来讨论一个老问题
- 没有加密也打不开的数据库的打开问题:和VB,ACCESS,数据库有关的问题
- 帮忙做个vb小软件用于系统管理
- vsflexgrid中可以拆分单元格吗?如何拆?
- 在Word对象中创建好一个表格后如何将光标移到第2页首行再创建一个表格?
- excel VBA判断后 跳转页面如何写
open "c:\myfile.dat" for binary as #1
dim s as string * 7
get #1,lof(1)-6,s '读取后按字符串用正则匹配就行了
debug.print s
close #1
2、修改后直接用put写就行了,不过要计算好开始写入的位置:
open "c:\myfile.dat" for binary as #1
'此处是处理过程
put #1,lPos,data 'lPos是计算好的位置,data可以是字符串也可以是byte数组
close #1
3、如果要去掉末尾的标志字符,也就是使文件变小,也无需重新写入另一个文件,如果需要我再给你提供代码。
1是不可行的
因为:
在VB中一定要记住,不能使用String变量处理二进制数据。早期的VB是采用单字节处理方式(通常也称为ANSI方式),也就说一个英文字母用一个字节表示,一个汉字算两个字节,当然这样就可能出现半个汉字的问题。从VB 4.0起,VB采用了一种新的处理方式,即内部采用Unicode方式,即不论英文字母还是汉字,一律用两个字节表示,但Unicode还不够普及,所以VB只是在其内部完全使用Unicode,而在外部仍转换为人们习惯的ANSI方式,但在字符串处理上与先前的版本有所不同。例如:在中文Windows或英文Windows外挂RichWin 97中,Len("电子&电脑")=5(这里的&号为半角字符),而在以前的版本或纯英文Windows中Len("电子&电脑")=9。除了Len、Left、Right等字符串函数受此影响外,所有字符操作都受此影响。如果你把二进制数据读入字符串变量,在读入的过程中会发生转换错误,这样你再写入文件数据也就不对了。以上的讨论对于中文等双字节系统都是适用的,但英文版下没有这个问题。所以,你在网上看到的许多程序因为都是美国人写的,他们根本就不考虑这个问题,使用字符串来处理二进制数据,但这样的程序在中文系统中肯定出错。解决的办法是使用Byte数组来处理二进制数据,这样就不会有你说的问题了
2、get和put的第一个参数是文件号,第二个参数是读写位置,第三个参数是数据,你用binary方式打开一个文件后,在close前,可以在任意位置读取和写入数据,除非必要,你完全可以只读写需要处理的数据,而不必整个文件读出后再处理,更不用处理完后写入另一个文件,只是需要处理好每次读写的位置,相当于指针。
不管怎樣VB相對其他語言來說 開發效率和執行效率并不算差
十分感谢
可是对于您的第一个回答:
我试了一下,我直接是binary读入,存到string里,然后再把这个string写到另一个文件,(这是一个gif文件),却提示gif打不开了,这是为什么呢谢谢!
经过不断尝试,我发现,1楼的大哥的方法是可行的
而我之所以失败,是因为我在写文件的时候,用错了方法:
Open sFileName For Output As h
Print #h, SFile
Close这样导致文件打不开
而还是应该是二进制方式写回去谢谢老大了~~~~~~~~~~~收我为徒吧
结贴了~~~~~~~~~~~
byte數組直接可以當作用字符串來使用
我給你舉個例子就知道了Private Sub Command1_Click()
Dim a() As Byte
Dim b() As Byte
a = "1234abc"
b = "abc"
b(2) = 0
a(6) = 0
a(10) = 0
Debug.Print InStr(a, b), a, b, UBound(a), UBound(b)
ReDim Preserve a(14)
a(14) = 66
ReDim Preserve b(6)
b(6) = 65
Debug.Print InStrB(a, b), a, b, UBound(a), UBound(b)
End Sub
Dim a() As Byte
Dim b() As Byte
a = "1234abc"
b = "abc"
b(2) = 0
a(6) = 0
a(10) = 0
Debug.Print InStr(a, b), a, b, UBound(a), UBound(b)
ReDim Preserve a(14)
a(14) = 66
ReDim Preserve b(6)
b(6) = 65
Debug.Print InStrB(a, b), a, b, UBound(a), UBound(b)
b(6) = 66
Debug.Print InStrB(a, b), a, b, UBound(a), UBound(b)
End Sub