Позиция байта, в котором найден искомый текст в vb.net

#vb.net #byte

#vb.net #байт

Вопрос:

Я хотел бы включить в приведенный ниже код код, который позволил бы мне узнать позицию в байтах в файле, искомого и найденного текста! Возможно ли это ? Заранее благодарю вас за предоставленную мне вашу помощь и ваши знания.

 Dim a As Integer

a = 1
For Each filename In list

    Sun j, i As Integer
    Dim ByteBuffer As Byte () = File.ReadAllBytes (filename)
    Dim StringBytes As Byte () = System.Text.Encoding.UTF8.GetBytes (matches)
    For i = 0 To ByteBuffer.Length - StringBytes.Length

        If ByteBuffer (i) = StringBytes (0) Then
            j = 1

            While j <StringBytes.Length AndAlso ByteBuffer (i   j) = StringBytes (j)
                j   = 1
            End While

            If j = StringBytes.Length Then MsgBox ("String was found at offset {0}", i)

        End If
    Next

    ListView1.Items.Add (System.IO.Path.GetFileName (filename))
    ListView1.Items (a - 1) .SubItems.Add (i)
    ListView1.Items (a - 1) .SubItems.Add (Convert.ToInt32 (i / 2987))
    a   = 1

Next
 

Комментарии:

1. Итак, что не работает в опубликованном коде?

2. Я не могу определить местоположение позиции байта в текстовом файле после нахождения текста.

3. Вы видели сообщение MsgBox?

4. Да, я прочитал это, Стив!

5. Таким образом, если MsgBox отображает правильное значение, то проблема заключается в том, как вы добавляете элементы в listview. Обратите внимание, что вы никогда не прекращаете поиск в байт-буфере даже после того, как нашли искомые байты. Это будет выполняться до конца цикла, и я всегда буду последним искомым индексом

Ответ №1:

Я попробовал ваш код, и он правильно находит положение искомых байтов.
Таким образом, проблема в другом месте, и это вызвано тем фактом, что код не останавливается после нахождения байтов, но продолжается до конца поиска в буфере.
Но в этот момент переменная i всегда будет равна условию, которое завершает цикл.

Вам нужно добавить простой выход, когда вы найдете совпадение

 If j = StringBytes.Length Then 
    MsgBox ("String was found at offset {0}", i)
    
    ' This stops the loop over the current file and the variable i is pointing to the offset searched
    Exit For
End if
 

Конечно, если вам нужно найти каждое совпадение в файле, а не только первое, тогда вам нужно завершить цикл и собрать найденные смещения. В этом случае вам нужна переменная типа List (целого числа), объявленная при входе в файловый цикл

 Sun j, i As Integer
Dim ByteBuffer As Byte () = File.ReadAllBytes (filename)
Dim StringBytes As Byte () = System.Text.Encoding.UTF8.GetBytes (matches)
Dim offsets as List(Of Integer) = new List(Of Integer)
For i = 0 To ByteBuffer.Length - StringBytes.Length

    If ByteBuffer (i) = StringBytes (0) Then
        j = 1

        While j <StringBytes.Length AndAlso ByteBuffer (i   j) = StringBytes (j)
            j   = 1
        End While

        If j = StringBytes.Length Then 
           MsgBox ("String was found at offset {0}", i)
           offsets.Add(i)
        End if
    End If
Next
if offsets.Count > 0 Then
    ListView1.Items.Add (System.IO.Path.GetFileName (filename))
    ListView1.Items (a - 1).SubItems.Add (string.Join(" >", offsets))
    a   = 1
End If 
 

Комментарии:

1. Спасибо, Стив, это работает в обоих случаях. Тема решена. Еще раз спасибо. 🙂