2017-01-12 10 views
0

У меня есть рабочая программа, но это как Франкенштейн - части других программ, собранных вместе, которые могут быть излишними. Вот что я пытаюсь сделать: Найдите строку внутри двоичного файла & из этого местоположения в 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. В этом примере используется RegEx найти все матчи строки в любом файле, возвращая каждый матч со всем, что не следует за ним до следующего матча или в конце файла в UTF-8 строку:

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 

Узор RegEx определение является следующим:

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

Может ли downvoter объяснить, что не так с этим ответом? –

+0

Что такое флаги шаблона публикации, когда ваше Regex явно не использует? Я предполагаю, что вы просто скопировали и вставили с любого сайта регулярного выражения, в котором вы были. Вы устанавливаете их как опции при построении своего регулярного выражения просто не встроенным и неактуальны. Вы можете опубликовать OP как встроенный подход, чтобы они поняли более четко. Также OP сказал *** «найти строку в двоичном файле» ***, ваш подход не будет работать. – Codexer

+0

Во-первых, флаги находятся прямо там, как опции, потому что это как раз то, как обычно делаются в .NET. Во-вторых, они не несущественны. Если вы удаляете флаг S, совпадение останавливается на символах новой строки. Но, конечно, вы можете удалить флаг I. В-третьих, он работает в двоичном файле без каких-либо проблем. Я просто попробовал его на 25 Мбайт исполняемый файл и нашел 902 матча слова «данные». Попробуй. –

 Смежные вопросы

  • Нет связанных вопросов^_^