Bytes neuschreiben und wieder einlesen

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bytes neuschreiben und wieder einlesen

    Hey Leute ich steh mal wieder vor ein Problem, was denk ich ganz einfach zu lösen ist:)

    Also folgendes: (ich poste erstmal die beiden Codes, damit ihr wisst, worum es geht)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim tmp As String = TextBox1.Text.ToString
    2. Dim sfd As New SaveFileDialog
    3. If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
    4. Dim stub As Byte() = System.IO.File.ReadAllBytes(Application.StartupPath & "\stub.exe")
    5. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    6. Dim tmp_byte As Byte() = enc.GetBytes(tmp)
    7. Dim create(0 To stub.Length + tmp_byte.Length) As Byte
    8. For i As Integer = 0 To stub.Length - 1
    9. create(i) = stub(i)
    10. Next
    11. Dim pos As Integer = 0
    12. For i As Integer = stub.Length To stub.Length + tmp_byte.Length - 1
    13. create(i) = tmp_byte(pos)
    14. pos += 1
    15. Next
    16. System.IO.File.WriteAllBytes(sfd.FileName, create)
    17. End If



    So hier erstell ich eine neue Datei die ein String von der TextBox mitgibt...

    Jetzt soll die erstelle Datei aber den String wiedergeben, in irgendeiner Weiße!
    Dazu les ich die Bytes ein und konvertier doch "eig" nur die Bytes wieder zurück, die ich geadded habe, oder etwa nicht?! (die letzten nach der Stub)

    Der Code dazu sieht so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    2. Dim mebyte As Byte() = System.IO.File.ReadAllBytes(Application.ExecutablePath)
    3. Dim pos As Integer = 25088
    4. Dim newbyte(0 To mebyte.Length - pos - 1) As Byte
    5. For i As Integer = 0 To newbyte.Length - 1
    6. pos += 1
    7. newbyte(i) = mebyte(pos)
    8. Next
    9. TextBox1.Text = enc.GetString(newbyte)




    Tut mir leid, aber irgendwo hängt es... Weiß leider nicht wo!
    Hab schon die Bytes ausgelesen, die werden mir richtig angezeigt...

    Es kommt ne Fehlermeldung Index außer Bereich!
    Warum machst es Dir so schwer? Lies die Bytes der Datei in eine List (Of Byte), erzeuge Dir die Bytes des Strings und füge sie in die Liste ein, danach die Liste wieder mit WriteAllBytes speichern, fertig. Beim Zurückholen lädst wieder alles in eine List (Of Byte), holst Dir mit GetRange die Bytes des Strings und konvertierst ihn wieder zurück.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Da bleibt Dir nix anderes übrig, als diese Information mit rein zu schreiben, vestehst? Du schreibst entweder die Länge des Strings mit oder Du musst das Ende des Stings markieren. Ohne diese Info läuft das nicht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ja das weiß ich... Ich weiß auch, das es so normal funktionieren muss:)
    Aber irgendwo nach dem:

    VB.NET-Quellcode

    1. Dim newbyte(0 To mebyte.Length - pos - 1) As Byte

    haut er mir nen Fehler...

    Hab schon ziemlich alles durch:)
    Diese -1 dauerndt machen mich einfach zu schaffen...
    Vllt irgendwo ein -1 zu wenig oder viel, weiß es nicht!

    Deswegen frag ich:)

    Edit: Hab mir schon ne Zeichnung gemacht mit den Bytes, nicht das ich ein Byte zu früh oder zu spät rausfische:)
    Ich sag Dir ja. Arbeite mit Listen, da ersparst Dir viel Ärger. Hab ein Beispiel für Dich.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Public Class Form1
    4. Private _exePathUncoded As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\test.exe"
    5. Private _exePathCoded As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\test1.exe"
    6. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    7. End Sub
    8. Private Sub HideText(ByVal s As String)
    9. Dim fileBytes() As Byte = File.ReadAllBytes(_exePathUncoded)
    10. Dim textBytes() As Byte = Encoding.UTF8.GetBytes(s)
    11. Dim stringLen As Integer = textBytes.Count
    12. Dim lenBytes() As Byte = BitConverter.GetBytes(stringLen)
    13. Dim tmpBytes As New List(Of Byte)
    14. tmpBytes.AddRange(fileBytes)
    15. tmpBytes.AddRange(textBytes)
    16. tmpBytes.AddRange(lenBytes)
    17. File.WriteAllBytes(_exePathCoded, tmpBytes.ToArray())
    18. End Sub
    19. Private Sub GetTextBack()
    20. Dim fileBytes As New List(Of Byte)
    21. Dim lenBytes() As Byte = Nothing
    22. Dim stringLen As Integer = 0
    23. Dim textBytes() As Byte = Nothing
    24. Dim theString As String = ""
    25. fileBytes.AddRange(File.ReadAllBytes(_exePathCoded))
    26. lenBytes = fileBytes.GetRange(fileBytes.Count - 4, 4).ToArray()
    27. stringLen = BitConverter.ToInt32(lenBytes, 0)
    28. fileBytes.RemoveRange(fileBytes.Count - 4, 4)
    29. textBytes = fileBytes.GetRange(fileBytes.Count - stringLen, stringLen).ToArray()
    30. theString = Encoding.UTF8.GetString(textBytes)
    31. End Sub
    32. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    33. HideText("Hallo Du da :-)")
    34. End Sub
    35. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    36. GetTextBack()
    37. End Sub
    38. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hab mir Deinen Code nochmal genauer angeschaut. Normal sollte man Dir bei so etwas nicht helfen, aber gut.

    VB.NET-Quellcode

    1. 'Abgeändert.
    2. Private Sub h(ByVal tmp As String)
    3. Dim stub As Byte() = System.IO.File.ReadAllBytes(_exePathUncoded)
    4. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    5. Dim tmp_byte As Byte() = enc.GetBytes(tmp)
    6. Dim create(stub.Length + tmp_byte.Length - 1) As Byte 'deklarier Arrays lieber so.
    7. For i As Integer = 0 To stub.Length - 1
    8. create(i) = stub(i)
    9. Next
    10. Dim pos As Integer = 0
    11. 'Du berechnest hier nicht die Position, sondern die Länge des Strings.
    12. 'Pos. ist daher etwas irreführend.
    13. For i As Integer = stub.Length To stub.Length + tmp_byte.Length - 1
    14. create(i) = tmp_byte(pos)
    15. pos += 1
    16. Next
    17. System.IO.File.WriteAllBytes(_exePathCoded, create)
    18. End Sub
    19. Private Sub d()
    20. Dim mebyte As Byte() = System.IO.File.ReadAllBytes(_exePathCoded)
    21. Dim pos As Integer = 15 'hier die Länge, die Du oben erhalten hast.
    22. Dim newbyte(pos - 1) As Byte
    23. 'Da Du ja den String hinten angehängt hast, musst Du das so machen.
    24. For i As Integer = 0 To pos - 1
    25. newbyte(i) = mebyte(mebyte.Length - pos + i)
    26. Next
    27. Dim s As String = Encoding.Default.GetString(newbyte)
    28. End Sub


    Das ist Dein Code von oben, nur etwas abgeändert, damit ich testen konnte. Beachte bitte die Kommentare.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    n1nja schrieb:

    Es kommt ne Fehlermeldung Index außer Bereich!

    5 Regeln für sinnvolle Fragen - Fehlerzeile?

    Aber insgesamt scheint mir, du tust nix anneres als auf umständliche Weise zwei Strings hintereinander in eine Datei zu schreiben - oder übersehe ich was?
    Weil das ginge sicherlich wesentlich einfacher, etwa mit einem StreamWriter.
    Aber vlt. übersehe ich wirklich was, weil wenn du die Strings beim Auslesen auseinanderhalten willst - da müssten noch iwelche Vorkehrungen getroffen sein.
    Ich kann keine Fehlerzeile oder sonst was Posten da ich es nicht weiß! Der Fehler kommt sobald ich die erstellte Datei starte:)

    Wenn ich die Stub debugge kommt kein Fehler!
    Nur wenn ich starte!

    Und nein ich möchte nur einen String ans Ende der Datei schreiben und beim öffnen der Datei den String Auslesen und anschließend bearbeite ich den!

    Kann erst heut Abend nochmal alles durchgehen!

    n1nja schrieb:

    Und nein ich möchte nur einen String ans Ende der Datei schreiben und beim öffnen der Datei den String Auslesen und anschließend bearbeite ich den!

    welchen String möchtest du auslesen?
    In einer TextDatei ist im Grunde nur ein STringg drin, und wenn man am Ende was anfügt, so vermehrt der String sich nicht, sondern wird einfach länger.

    Oder aber es gibt die Möglichkeit, eine TextDatei zeilenweise zu lesen - da kann man eine Zeile zufügen, und kann die auch wieder als String auslesen.

    Beides lässt sich sehr einfach mit der STreamWriter-Klasse umsetzen - informiere dich im ObjectBrowser/ObjektKatalog darüber.
    (oder warte, bis dir hier jmd. ein fertiges Snippet serviert)
    Ja ich weiß wie es mit nen StreamWriter usw funktioniert!
    Doch ich hab keine Textdatei!
    Das ist ne exe...
    Die Les ich ein um den String zu adden! Danach wieder abspeichern als Exe! Die auch ausführbar bleiben soll!
    Deswegen Wandel ich den String in Bytes um...
    schreib ich die Größe der Stub Manuel rein! 25088 in den Fall!
    kann ich in deim Code nicht erkennen, wo das stattfindet

    ah - du schreibst es nicht in die DAtei, sondern im Code deines Manipulations-Programms (was sich wohl selbst manipuliert).

    wiedemauchsei:

    mach dirn Stream-Writer/-Reader, setze dessen .BaseStream.Position auf 25088, und fang dann an zu lesen oder zu schreiben oder was du wolle.

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

    So Leute hab mal bisschen noch rumprobiert!

    Vorweg die Methode von SpaceyX funktioniert ohne Probleme!
    Jedoch muss ich hier jedesmal die Größe auch angeben!

    Ich hab mir also Überlegt, ich kann auch direkt Strings in die Exe schreiben...
    Und siehe da, es funktioniert auch:)

    Hier mal das kleine Testtool:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub TextBox1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDoubleClick ' Da wird eine Dateo geöffnet
    3. Dim ofd As New OpenFileDialog
    4. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    5. TextBox1.Text = ofd.FileName
    6. End If
    7. End Sub
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Hier wird die Datei wieder gespeichert mit einen bestimmten Wert
    9. Dim sfd As New SaveFileDialog
    10. If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
    11. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    12. Dim datei As Byte() = System.IO.File.ReadAllBytes(TextBox1.Text)
    13. Dim text As String = enc.GetString(datei) & "startstring" & "WertDenIchHabenWill"
    14. Dim newfile As Byte() = enc.GetBytes(text)
    15. System.IO.File.WriteAllBytes(sfd.FileName, newfile)
    16. MessageBox.Show("done")
    17. End If
    18. End Sub
    19. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 'Jetzt wird mir der Wert der Datei ausgelesen
    20. Dim ofd As New OpenFileDialog
    21. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    22. Dim file As Byte() = IO.File.ReadAllBytes(ofd.FileName)
    23. Dim text As String = System.Text.Encoding.Default.GetString(file)
    24. Dim pos As Integer = text.IndexOf("startstring") + 11
    25. Dim lang As Integer = file.Length - pos
    26. Dim tmp As String = text.Substring(pos, lang)
    27. MessageBox.Show(tmp)
    28. End If
    29. End Sub
    30. End Class



    Ist das nun auch ne saubere Lösung oder soll ich doch mit StreamW/R arbeiten?!
    also mir scheint, allen beteiligten hätten einigen Gewinn davon, sich mal mit Streams und STream-Konzepten auseinanderzusetzen. Das sollte ihr DateiHandling, Kommunikationsgeschichten via INet, RohDaten-konvertierung (Verschlüsselung, Kompression) und sowas grundlegend ändern. Halt alles, wo viele Daten rumgeschaufelt werden.
    vlt. Stream-Konzepte guggen

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