#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. Спасибо, Стив, это работает в обоих случаях. Тема решена. Еще раз спасибо. 🙂