我做的是一个修复 被病毒感染的文件 的工具
被病毒感染的文件 末尾是特定的字符串,我要用正则表达式匹配到但是为了不破坏原来的文件,所以只能以二进制读取,这就带来一系列的问题:
比如:
1·byte数组怎么匹配到那个字符串
2·修改后怎么回写到原来的文件中我目前没有好的想法,主要卡在“用VB 修改二进制文件,并且匹配二进制文件中的字符串”
我这两天已经百度了不下几百页了,还是没方案
真诚等到高人的出现,有例子就更好啦

解决方案 »

  1.   

    1、以二进制打开,同样可以按字符串方式读取数据,比如用下面的方法读取最末尾的7个字符:
      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、如果要去掉末尾的标志字符,也就是使文件变小,也无需重新写入另一个文件,如果需要我再给你提供代码。
      

  2.   

    回happy_sea :
    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数组来处理二进制数据,这样就不会有你说的问题了
      

  3.   

    1、这种病毒在文件末尾添加的特殊字符不会是中文的吧,因为你只需要判断是否为真,所以我说的用字符串处理仍然是可行的;
    2、get和put的第一个参数是文件号,第二个参数是读写位置,第三个参数是数据,你用binary方式打开一个文件后,在close前,可以在任意位置读取和写入数据,除非必要,你完全可以只读写需要处理的数据,而不必整个文件读出后再处理,更不用处理完后写入另一个文件,只是需要处理好每次读写的位置,相当于指针。
      

  4.   

    因為在中國VB群相對其他語言認可度沒那么高
    不管怎樣VB相對其他語言來說 開發效率和執行效率并不算差
      

  5.   


    十分感谢
    可是对于您的第一个回答:
    我试了一下,我直接是binary读入,存到string里,然后再把这个string写到另一个文件,(这是一个gif文件),却提示gif打不开了,这是为什么呢谢谢!
      

  6.   


    经过不断尝试,我发现,1楼的大哥的方法是可行的
    而我之所以失败,是因为我在写文件的时候,用错了方法:
    Open sFileName For Output As h
            Print #h, SFile
        Close这样导致文件打不开
    而还是应该是二进制方式写回去谢谢老大了~~~~~~~~~~~收我为徒吧
    结贴了~~~~~~~~~~~
      

  7.   

    最好不要存到string變量中
    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
      

  8.   

    增加2行代碼會更清楚 VB怎么操作字符串的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)
      b(6) = 66
      Debug.Print InStrB(a, b), a, b, UBound(a), UBound(b)
    End Sub