2012-11-13 126 views
1

在VB.Net我打開與BinaryReader在文件..VB.Net獲取偏移地址

我需要找到一些的十六進制值的文件,如果他們被發現,它返回第一個的偏移地址字節..

這是可能的嗎?怎麼能做到這一點?謝謝

編輯:

我當前的代碼:

Private Function findOffset() 
    Using reader As New BinaryReader(File.Open(filename, FileMode.Open)) 
     ' Loop through length of file. 
     Dim pos As Integer = 0 ' <== THIS IS THE OFFSET 
     Dim length As Integer = reader.BaseStream.Length 
     Do While pos < length 
      ' Read the integer. 
      Dim value As Byte = reader.ReadByte() 
      If value = CByte(&H41) Then 
       Return pos 
       Exit Do 
      End If 
      ' Add length of integer in bytes to position. 
      pos += 1 
     Loop 
    End Using 
End Function 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    MsgBox(Hex(findOffset()).ToString.PadLeft(6, "0"c)) 
End Sub 

我想要做的是:

例如,我打開一個文件,在該文件中有開一個十六進制編輯器,我看到有一些十六進制值,41,42,43,44。我需要找到這些值,然後返回找到它們的偏移地址。

與我目前的代碼,它的工作原理,但我只能找到1Byte,我需要找到超過1 .. 我可能需要找到1kb或更多的數據!

我正在找一些bin文件中的可用空間。所以例如我需要10Byte的可用空間。那在Hex heditor中將會是FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,我需要找到它並返回第一個空字節的偏移地址。

編輯2

這裏代碼的第一行。

Private Function findOffset(query as Byte()) 
     Using reader As New BinaryReader(File.Open(filename, FileMode.Open)) 
      Dim startOffset = 80 
      Dim length As Integer = reader.BaseStream.Length - startOffset 
      reader.BaseStream.Position = startOffset 
      If query.Length <= length Then 
      ... 

可是不行的。它告訴我,從十進制自由空間開始偏移00000047

我做錯了什麼在這裏,我不明白你也通過

是什麼意思

修改 「長度」 可變 「長度=長度 - 開始偏移」

回答

1
Using reader As New BinaryReader(File.Open("file.bin", FileMode.Open)) 
    ' Loop through length of file. 
    Dim pos As Integer = 0 ' <== THIS IS THE OFFSET 
    Dim length As Integer = reader.BaseStream.Length 
    While pos < length 
    ' Read the integer. 
    Dim value As Byte = reader.ReadByte() 
      If value == 123 Then 
       return pos 
      End If 
    ' Write to screen. 
    Console.WriteLine(value) 
    ' Add length of integer in bytes to position. 
    pos += 1 
    End While 
End Using 

略有http://www.dotnetperls.com/binaryreader-vbnet

編輯修改要通過你的函數內部數組搜索你要循環值的數組。

Private Function findOffset(query as Byte()) 
    Using reader As New BinaryReader(File.Open(filename, FileMode.Open)) 
     Dim length As Integer = reader.BaseStream.Length 
     If query.Length <= length Then 
      ' process initial (first) search 
      Dim values As Byte() = reader.ReadBytes(query.Length) 
      Dim found As Boolean = False 
      For fnd = 0 To query.Length - 1 
       If values(fnd) <> query(fnd) Then 
        found = False 
        Exit For 
       End If 
       found = True 
      Next fnd 
      If found = True Then 
       Return 0 
      Else ' keep searching the rest of the binary stream 
       For pos = query.Length To length - 1 
        ' shift values over 1, [1,2,3,4] => [2,3,4,4] 
        Array.Copy(values, 1, values, 0, values.Length - 1) 
        ' put the next new byte at the end 
        values(values.Length - 1) = reader.ReadByte() 
        For fnd = 0 To query.Length - 1 
         If values(fnd) <> query(fnd) Then 
          found = False 
          Exit For 
         End If 
         found = True 
        Next fnd 
        If found = True Then 
         Return pos - (query.Length - 1) 
        End If 
       Next pos 
      End If 
     End If 
    End Using 
    Return -1 ' not found 
End Function 

注意:我沒有測試過上面的代碼,所以可能會出現語法錯誤。

+0

好吧,我設法讓它工作,因爲我需要。現在的問題是,我需要找到多個字節..我編輯我的帖子與當前的代碼和我想要做的例子。 – Fr0z3n

+0

@DjRikyx - 在流內搜索數組的值是多一點工作,檢查我的編輯 –

+0

我正在測試它,但似乎不工作。但我認爲我做錯了什麼。例如..當我使用該功能,'查詢'必須是什麼格式?對不起,但我是VB.net的初學者 – Fr0z3n