1

VB.Netで、BinaryReaderでファイルを開きます。

ファイルでいくつかの16進値を見つける必要があり、それらが見つかった場合は、最初のバイトのオフセットアドレスが返されます。

可能です?どうすればこれを達成できますか?ありがとうございました

編集:

私の現在のコード:

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

私がやろうとしていることは:

たとえば、ファイルを開くと、そのファイルを16進エディターで開くと、いくつかの16進値があることがわかります41,42,43,44。その値を見つけて、それらが見つかったオフセットアドレスを返す必要があります。

私の現在のコードでは動作しますが、1バイトしか見つけることができず、1つ以上を見つける必要があります。1kb以上のデータを見つける必要がありますか?

いくつかのbinファイルの空き領域を見つけるためにこれを作成しています。たとえば、10バイトの空き容量が必要です。これはFF,FF,FF,FF,FF,FF,FF,FF,FF,FF16進エディタ内にあり、それを見つけて最初の空のバイトのオフセットアドレスを返す必要があります。

編集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
            ...

しかし、機能しません..空き領域は10進数のオフセットから始まることがわかります00000047

私はここで何か間違ったことをしました、私はあなたが何を意味するのかよく理解していませんでした

「長さ」変数「長さ=長さ-startOffset」を変更します

4

1 に答える 1

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

注:上記のコードはテストしていないため、構文エラーが発生する可能性があります。

于 2012-11-13T14:08:52.873 に答える