2017-01-12 6 views
0

私は働いているプログラムを持っていますが、それはFrankensteinのようなものです。ここで私がやろうとしていることは次のとおりです。 バイナリファイル&内の文字列を、その場所からEOFに移動して内容を文字列にダンプします。パフォーマンスを探しているときに私のコードを最適化するにはどうすればいいですか - vb.net

Imports System.IO 
Public Class Form1 
    Dim b() As Byte = IO.File.ReadAllBytes("C:\data.bin") 
    Dim encodme As New System.Text.ASCIIEncoding 
    Dim SearchString As String = "xyzzy" 
    Dim bSearch As Byte() = encodme.GetBytes(SearchString) 
    Dim bFound As Boolean = True 
    Dim oneByte As Byte 
    Dim fileData As New IO.FileStream("C:\data.bin", FileMode.Open, FileAccess.Read) 
    Dim strMessage As String 



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     For i As Integer = 0 To b.Length - bSearch.Length - 1 
      If b(i) = bSearch(0) Then 
       bFound = True 
       For j As Integer = 0 To bSearch.Length - 1 
        If b(i + j) <> bSearch(j) Then 
         bFound = False 
         Exit For 
        End If 
       Next 
       If bFound Then 
        fileData.Seek(i + 5, SeekOrigin.Begin) 
        strMessage = "" 
        For r As Integer = (i + 5) To fileData.Length() - 1 
         oneByte = fileData.ReadByte() 
         strMessage = strMessage + Chr(oneByte) 


        Next r 
        MsgBox(strMessage) 
       Else 
        MsgBox("File Doesn't have string") 
        Exit Sub 
       End If 

      End If 

     Next 





    End Sub 
End Class 
+5

[CodeReview](http://codereview.stackexchange.com/)をご覧ください。 –

+0

sourcemaking.comで学ぶ –

答えて

-1

、それはバイト単位での事バイトのこの種を歩くしようとして避けるのがベストです:

は、ここに私のコードです。代わりに、.NETが提供する機能を使用する必要があります。

Imports System.IO 
Imports System.Text 
Imports System.Text.RegularExpressions 

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim matches = FindStringMatchesInFile("C:\Infinite Air\snowboarding.exe", "data") 

     For Each m In matches 
      ... 
     Next 
    End Sub 


    Private Function FindStringMatchesInFile(filename As String, 
              searchString As String) As List(Of String) 
     Dim output As New List(Of String) 
     Dim reader = New StreamReader(filename, Encoding.UTF8) 

     Dim re = New Regex(String.Format("{0}(?:(?!{0}).)*", searchString), 
          RegexOptions.Singleline Or RegexOptions.IgnoreCase, 
          Regex.InfiniteMatchTimeout) 

     Dim matches = re.Matches(reader.ReadToEnd()) 

     For Each m As Match In matches 
      output.Add(m.ToString()) 
     Next 

     Return output 
    End Function 
End Class 

正規表現パターン:この例ではUTF-8文字列内の次の試合や、ファイルの終わりまでそれを次のすべてに各マッチを返す、任意のファイル内の文字列のすべての一致を見つけるために正規表現を使用しています

Matches the characters {searchString} literally (case insensitive) 
Non-capturing group (?:(?!{searchString}).)* 
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
Negative Lookahead (?!{searchString}) 
Assert that the Regex below does not match 
Matches the characters {searchString} literally (case insensitive) 
. matches any character 

Global pattern flags 
g modifier: global. All matches (don't return after first match) 
s modifier: single line. Dot matches newline characters 
i modifier: case insensitive. 
+0

この回答で何が間違っているのかをダウンダウン者が説明できますか? –

+0

あなたのRegexが明らかに何も使用していないときに、ポスティングパターンフラグを使用するのは何ですか?私はあなたがコピーしていた正規表現のサイトからペーストしたと仮定します。 Regexをインラインで作成するのではなく、関係のないものをオプションとして設定します。あなたはより明確に理解できるように、OPにインラインアプローチを表示して投稿することができます。また、OPは*** "バイナリファイル内の文字列を見つける" ***、あなたのアプローチは動作しません。 – Codexer

+0

まず、オプションは、フラグがそこにあります。これは、通常、.NETでの処理が行われるためです。第二に、彼らは無関係ではありません。 Sフラグを削除すると、改行で停止します。しかし、確かに、あなたはIフラグを削除することができます。第三に、バイナリファイルで問題なく動作します。私はちょうど25MBの実行可能ファイルでそれを試し、単語 "データ"の902の一致が見つかりました。それを試してみてください。 –

関連する問題