Bin Datei öffnen und als Hex auslesen

  • VB.NET

Es gibt 49 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    ofd.FileName ist doch der Pfad, den du ausgewählt hast.
    Warte mal kurz, ich bastel dir ein kleines Beispiel.

    Edit:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim ofd As New OpenFileDialog
    3. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then TextBox1.Text = GetHexString(ofd.FileName)
    4. End Sub
    5. Private Function GetHexString(fileName As String) As String
    6. Dim hexString = String.Empty
    7. Using fs = File.OpenRead(fileName)
    8. Using br As New BinaryReader(fs)
    9. Do Until fs.Position = fs.Length
    10. hexString &= br.ReadByte.ToString("X")
    11. Loop
    12. End Using
    13. End Using
    14. Return hexString
    15. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    Achso und da wird das schon in die TextBox eingebunden ja? Dann probier ichs mal aus...Erstmal danke ;D

    Edit:
    Also ich bekomme zwar keine Meldung mehr, aber der öffnet das auch nicht. Dauert stundenlang und dann keine Rückmeldung -_-
    Visual Basic zeigt mir dann diese Deadlock Meldung an...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xylon“ ()

    Also zur Erklärung: Die Funktion GetHexString bekommt einen Dateipfad übergeben und liefert den Inhalt dieser Datei in Hex-Darstellung zurück. Im Form_Load wird dann ein OpenFileDialog erstellt, über den man eine Datei auswählen kann. Wenn man das getan hat wird diese Funktion mit der ausgewählten Datei aufgerufen und ihr Rückgabewert der TextBox zugewiesen.

    Wie groß ist denn die Datei? Ab dem Megabytebereich dauert das Einlesen mit unter schon mal ein paar Minuten.

    Xylon schrieb:

    Visual Basic zeigt mir dann diese Deadlock Meldung an...
    Poste bitte mal den aktuellen Code und schreib genau, in welcher Zeile welcher Fehler auftritt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Private Function GetHexString(ByVal fileName As String) As String
    2. Dim hexString = String.Empty
    3. Using fs = File.OpenRead(fileName)
    4. Using br As New BinaryReader(fs)
    5. Do Until fs.Position = fs.Length
    6. hexString &= br.ReadByte.ToString("X")
    7. Loop
    8. End Using
    9. End Using
    10. Return hexString
    11. End Function

    VB.NET-Quellcode

    1. Dim ofd As New OpenFileDialog
    2. Dim path2 As String = ofd.FileName
    3. ofd.InitialDirectory = "C:\"
    4. ofd.Filter = "RAM Dumps (*.bin)|*.bin|" & " All Files (*.*)|*.*"
    5. ofd.Title = "Choose a RAM Dump"
    6. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then TextBox4.Text = GetHexString(ofd.FileName)


    Eine Zeile gibts da nicht, die Meldung steht einfach da.

    Vielleicht hilfts, wenn ich euch mal mit einem Screenshot zeige, was ich brauche.
    postimg.org/image/xkgldd2p3/

    Ist halt wie bei einem Hex Viewer und eben diese bin Datei soll so ausgegeben werden...
    So, hier hast dus jetzt vollständig durchoptimiert und auf Threading umgeschrieben, mit Events und allem drum und dran:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    3. Dim ofd As New OpenFileDialog
    4. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    5. Dim reader As New HexReader(ofd.FileName)
    6. AddHandler reader.ProgressChanged, AddressOf HexReader_ProgressChanged
    7. AddHandler reader.Completed, AddressOf HexReader_Completed
    8. reader.BeginRead(1024 * 1024)
    9. End If
    10. ofd.Dispose()
    11. End Sub
    12. Private Sub HexReader_ProgressChanged(sender As Object, e As HexReaderProgressChangedEventArgs)
    13. Invoke(Sub() ProgressBar1.Value = e.Percentage)
    14. End Sub
    15. Private Sub HexReader_Completed(sender As Object, e As HexReaderCompletedEventArgs)
    16. Invoke(Sub() TextBox1.Text = e.HexString) 'hier den String anders verarbeiten, da Textbox nicht geeignet
    17. End Sub
    18. End Class
    19. Public Class HexReader
    20. Private file As FileInfo
    21. Private _hex As String
    22. Public Event Completed As EventHandler(Of HexReaderCompletedEventArgs)
    23. Public Event ProgressChanged As EventHandler(Of HexReaderProgressChangedEventArgs)
    24. Sub New(fileName As String)
    25. file = New FileInfo(fileName)
    26. End Sub
    27. Public ReadOnly Property HexValue As String
    28. Get
    29. Return _hex
    30. End Get
    31. End Property
    32. Public Sub BeginRead(bufferSize As Integer)
    33. Dim t As New Thread(AddressOf GetHexString)
    34. t.IsBackground = True
    35. t.Start(bufferSize)
    36. End Sub
    37. Private Sub GetHexString(obj As Object)
    38. Dim bufferSize = DirectCast(obj, Integer)
    39. Dim hexString As New StringBuilder
    40. Using fs = file.OpenRead
    41. Using br As New BinaryReader(fs)
    42. Do Until fs.Position = fs.Length
    43. Dim bytes() = br.ReadBytes(Math.Min(bufferSize, Convert.ToInt32(fs.Length - fs.Position)))
    44. For i = 0 To bytes.Length - 1
    45. hexString = hexString.Append(bytes(i).ToString("X"))
    46. Next
    47. RaiseEvent ProgressChanged(Me, New HexReaderProgressChangedEventArgs(Convert.ToInt32(fs.Position / fs.Length * 100)))
    48. Loop
    49. End Using
    50. End Using
    51. _hex = hexString.ToString
    52. RaiseEvent Completed(Me, New HexReaderCompletedEventArgs(_hex))
    53. End Sub
    54. End Class
    55. Public Class HexReaderCompletedEventArgs : Inherits EventArgs
    56. Private _hexString As String
    57. Public ReadOnly Property HexString As String
    58. Get
    59. Return _hexString
    60. End Get
    61. End Property
    62. Sub New(hexString As String)
    63. _hexString = hexString
    64. End Sub
    65. End Class
    66. Public Class HexReaderProgressChangedEventArgs : Inherits EventArgs
    67. Private _percentage As Integer
    68. Public ReadOnly Property Percentage As Integer
    69. Get
    70. Return _percentage
    71. End Get
    72. End Property
    73. Sub New(percentage As Integer)
    74. _percentage = percentage
    75. End Sub
    76. End Class


    Der Einlesevorgang dauerte bei einer 1,5MB Datei ~1Sekunde. Allerdings ist der String dabei so lang, dass die TextBox nicht mehr mitkommt, und deswegen nie fertig wird mit laden. Du musst dir also eine bessere Möglichkeit der Anzeige suchen.
    @Xylon: Das Format der Ausgabe auf dem Bild ist:

    VB.NET-Quellcode

    1. Dim ll As Long = 1234567890
    2. Dim txt = ll.ToString("X8")
    Oben hatten wir schon mal ein X2, aber das hast Du ja generös ignoriert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was könnte ich denn am besten nehmen um das alles anzeigen zu lassen? Und was packe ich dann nach dem Invoke(Sub)() rein? :S
    Oh und erstmal vielen vielen dank!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xylon“ ()

    Xylon schrieb:

    Was könnte ich denn am besten
    What :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hä? Artentus sagte doch, ich solle mir eine andere Möglichkeit suchen. Und beim Sub muss ein Audruck stehen, aber ich weiß nicht wirklich welcher, weil ich dmit noch nie gearbeitet habe. :/
    @Xylon: Du hast eine Frage an das Forum gestellt, ich habe sie nicht verstanden und mit What geantwortet.
    Wenn Du eine Frage an ein bestimmtes Mitglied des Forums stellen willst, richte sie gezielt an ihn:
    (diesen String dann bitte ohne Leerzeichen eingeben):
    "@ Xylon :" und dann Dein Text
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay, also Artentus hatte ja netterweise den Code gepostet. Und bei der 15. und der 19. Zeile soll ich laut VB einen Ausdruck angeben. Kann mir da vielleicht irgendjemand weiterheilfen?
    Welche Frameworkversion verwendest du denn? Das sind anonyme Methoden, die werden glaube ich erst ab 3.5 unterstützt.
    Mit der Anzeige meinte ich, dass die TextBox nicht gut genug ist, sie bringt das ganze Programm zu abstürzen. Du musst eine Möglichkeit finden immer nur einzelne Teile des Strings anzuzeigen, so wie auf deinem Bild.

    Xylon schrieb:

    Kann mir da vielleicht irgendjemand weiterheilfen?
    @Artentus: Für diesen Code brauchst Du das 2012er Studio.
    Such mal gezielt nach "Invoke VS 2008".
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich hab jetzt richtig viele Invoke Themen gefunden. Bin mir aber nicht sicher, ob das auch so richtig ist:

    VB.NET-Quellcode

    1. Dim mi As MethodInvoker = AddressOf UpdateFormText
    2. Me.Invoke(mi)


    Anstatt

    VB.NET-Quellcode

    1. Invoke(Sub() RichTextBox1.Text = e.HexString)


    Weil ich muss ja auch as e.HexString noch mit aufnehmen, und das geht irgendwie alles nicht. Es gibt auch noch irgendwie Control.Invoke, TextBox1.Invoke und und und. Habe bei Google nicht wirklich viel passendes gefunden was auch auf meine Programmart so zutrifft. Ich weiß wirklich nicht welches das richtige ist. Hat hier vieleicht auch jemand noch 2008?
    @Xylon: Probier mal dies:
    Invoke

    VB.NET-Quellcode

    1. Delegate Sub MyReceiveText(xxx As String)
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim xxx As String = "bla"
    4. If TextBox1.InvokeRequired Then
    5. ' Aufruf aus anderem Thread
    6. Dim d As New MyReceiveText(AddressOf ReceiveText)
    7. TextBox1.Invoke(d, xxx)
    8. Return
    9. End If
    10. ReceiveText(xxx)
    11. End Sub
    12. Private Sub ReceiveText(xxx As String)
    13. TextBox1.Text = xxx
    14. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Sorry, aber ich blicke da nicht mehr durch. Inwiefern kann ich das für

    VB.NET-Quellcode

    1. Private Sub HexReader_Completed(ByVal sender As Object, ByVal e As HexReaderCompletedEventArgs)
    2. Invoke(Sub() RichTextBox1.Text = e.HexString) 'hier den String anders verarbeiten, da Textbox nicht geeignet
    3. End Sub
    4. Private Sub HexReader_ProgressChanged(ByVal sender As Object, ByVal e As HexReaderProgressChangedEventArgs)
    5. Invoke(Sub() ProgressBar1.Value = e.Percentage)
    6. End Sub

    benutzten? Und wieso kann ich nur TextBox1 benutzen? Ich bin gerade echt verwirrt. Wie ich schon gesagt habe: Ich habe damit noch nie gearbeitet...

    Xylon schrieb:

    Und wieso kann ich nur TextBox1 benutzen?
    Und wieso glaubst Du, dass Du hier für all Deine Probleme perfekten Code geschenkt bekommst?
    Von mir bekommst Du Denkanstöße, dass Du Deinem Probleme allein lösen kannst.
    Selbstverständlich kannst Du auch den Code anderer Forumsmitglieder abschreiben und Dich dann wundern, dass es nicht so läuft, wie es Dir vorschwebt.
    Also:
    Die Hausaufgaben musst Du allein machen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!