Bin Datei öffnen und als Hex auslesen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
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
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Dim ofd As New OpenFileDialog
- If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then TextBox1.Text = GetHexString(ofd.FileName)
- End Sub
- Private Function GetHexString(fileName As String) As String
- Dim hexString = String.Empty
- Using fs = File.OpenRead(fileName)
- Using br As New BinaryReader(fs)
- Do Until fs.Position = fs.Length
- hexString &= br.ReadByte.ToString("X")
- Loop
- End Using
- End Using
- Return hexString
- 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...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
VB.NET-Quellcode
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
- Public Class Form1
- Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
- Dim ofd As New OpenFileDialog
- If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
- Dim reader As New HexReader(ofd.FileName)
- AddHandler reader.ProgressChanged, AddressOf HexReader_ProgressChanged
- AddHandler reader.Completed, AddressOf HexReader_Completed
- reader.BeginRead(1024 * 1024)
- End If
- ofd.Dispose()
- End Sub
- Private Sub HexReader_ProgressChanged(sender As Object, e As HexReaderProgressChangedEventArgs)
- Invoke(Sub() ProgressBar1.Value = e.Percentage)
- End Sub
- Private Sub HexReader_Completed(sender As Object, e As HexReaderCompletedEventArgs)
- Invoke(Sub() TextBox1.Text = e.HexString) 'hier den String anders verarbeiten, da Textbox nicht geeignet
- End Sub
- End Class
- Public Class HexReader
- Private file As FileInfo
- Private _hex As String
- Public Event Completed As EventHandler(Of HexReaderCompletedEventArgs)
- Public Event ProgressChanged As EventHandler(Of HexReaderProgressChangedEventArgs)
- Sub New(fileName As String)
- file = New FileInfo(fileName)
- End Sub
- Public ReadOnly Property HexValue As String
- Get
- Return _hex
- End Get
- End Property
- Public Sub BeginRead(bufferSize As Integer)
- Dim t As New Thread(AddressOf GetHexString)
- t.IsBackground = True
- t.Start(bufferSize)
- End Sub
- Private Sub GetHexString(obj As Object)
- Dim bufferSize = DirectCast(obj, Integer)
- Dim hexString As New StringBuilder
- Using fs = file.OpenRead
- Using br As New BinaryReader(fs)
- Do Until fs.Position = fs.Length
- Dim bytes() = br.ReadBytes(Math.Min(bufferSize, Convert.ToInt32(fs.Length - fs.Position)))
- For i = 0 To bytes.Length - 1
- hexString = hexString.Append(bytes(i).ToString("X"))
- Next
- RaiseEvent ProgressChanged(Me, New HexReaderProgressChangedEventArgs(Convert.ToInt32(fs.Position / fs.Length * 100)))
- Loop
- End Using
- End Using
- _hex = hexString.ToString
- RaiseEvent Completed(Me, New HexReaderCompletedEventArgs(_hex))
- End Sub
- End Class
- Public Class HexReaderCompletedEventArgs : Inherits EventArgs
- Private _hexString As String
- Public ReadOnly Property HexString As String
- Get
- Return _hexString
- End Get
- End Property
- Sub New(hexString As String)
- _hexString = hexString
- End Sub
- End Class
- Public Class HexReaderProgressChangedEventArgs : Inherits EventArgs
- Private _percentage As Integer
- Public ReadOnly Property Percentage As Integer
- Get
- Return _percentage
- End Get
- End Property
- Sub New(percentage As Integer)
- _percentage = percentage
- End Sub
- 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. -
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?
Oh und erstmal vielen vielen dank!Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xylon“ ()
-
Xylon schrieb:
Was könnte ich denn am bestenFalls 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! -
-
@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 TextFalls 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! -
-
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?
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:
Anstatt
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
- Delegate Sub MyReceiveText(xxx As String)
- Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
- Dim xxx As String = "bla"
- If TextBox1.InvokeRequired Then
- ' Aufruf aus anderem Thread
- Dim d As New MyReceiveText(AddressOf ReceiveText)
- TextBox1.Invoke(d, xxx)
- Return
- End If
- ReceiveText(xxx)
- End Sub
- Private Sub ReceiveText(xxx As String)
- TextBox1.Text = xxx
- 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
- Private Sub HexReader_Completed(ByVal sender As Object, ByVal e As HexReaderCompletedEventArgs)
- Invoke(Sub() RichTextBox1.Text = e.HexString) 'hier den String anders verarbeiten, da Textbox nicht geeignet
- End Sub
- Private Sub HexReader_ProgressChanged(ByVal sender As Object, ByVal e As HexReaderProgressChangedEventArgs)
- Invoke(Sub() ProgressBar1.Value = e.Percentage)
- 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?
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.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!
-
Ähnliche Themen
-
Dexxter - - Sonstige Problemstellungen
-
8 Benutzer haben hier geschrieben
- Xylon (20)
- RodFromGermany (10)
- Artentus (9)
- Gast (5)
- Gonger96 (3)
- VincentTB (1)
- Niko Ortner (1)
- Manawyrm (1)