BinaryWriter speichert Bytes nur als Text

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von woeh.

    BinaryWriter speichert Bytes nur als Text

    hallo,

    ich habe ein problem.
    ich lese x bytes aus eine datei und speicher diese in ein byte array.
    danach schreibe ich sie in eine andere datei. das komische ist, das es nur als text gespeichert wird.

    VB.NET-Quellcode

    1. Dim fsr As IO.FileStream
    2. Dim fsw As IO.FileStream
    3. Dim bw As IO.BinaryWriter
    4. Dim br As IO.BinaryReader
    5. Dim byt As Byte()
    6. 'Dim tmpFile As String = IO.Path.GetTempPath
    7. Dim tmpFile As String = "F:\1.mp3"
    8. Try
    9. fsr = New IO.FileStream(file.FullName, IO.FileMode.Open, IO.FileAccess.Read)
    10. br = New IO.BinaryReader(fsr)
    11. fsw = New IO.FileStream(tmpFile, IO.FileMode.Create, IO.FileAccess.Write)
    12. bw = New IO.BinaryWriter(fsw)
    13. fsr.Position = 0
    14. If fPos > 0 Then
    15. byt = br.ReadBytes(fPos)
    16. bw.Write(byt, 0, byt.Length)
    17. End If
    18. Catch ex As Exception
    19. Finally
    20. bw.Close()
    21. fsw.Close()
    22. br.Close()
    23. fsr.Close()
    24. End Try


    ich habe es auch mit

    VB.NET-Quellcode

    1. IO.File.WriteAllBytes()


    versucht, sowie mit

    VB.NET-Quellcode

    1. fsw.WriteByte


    es ist immer das gleiche ergebnis.
    es wird als text gespeichert.

    ich habe keine ahnung was ich falsch mach.

    in einem anderen sub bei mir wird das gemacht ohne probleme.
    ich habe dann den code kopiert...gleiches ergebnis.

    verstehe ich das was grundsätzliches nicht ?

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

    zum einen verstehe ich nicht, was die Leuts heutzutage immer mittm BinaryReader/Writer wollen.
    Bytes readen und writen kann man von Streams direkt, da braucht man keinen Reader für.

    Und dann scheint mir als erstes zu üprüfen, ob die Original-Datei nicht einfach eine Text-Datei ist?
    Daran würde so ein Kopiervorgang ja nix ändern.

    Dann würde ich sehr empfehlen, den TryCatch wegzumachen.
    So bekommst du garnet mit, wenn das Kopieren scheitert - evtl. guckst du immer dieselbe Datei nach, die garnet neu geschrieben wurde, aufgrund von Exceptions, die dir entgingen.
    TryCatch ist ein heißes Eisen - beherzigen!!
    also....ich habe Try-Catch entfernt.
    die zu lesende datei ist eine mp3-datei. ich kann sie wiedergeben.
    die datei soll nicht kopiert werden.

    ich habe die zu speichernde datei datei zwischendurch immer mal per hand gelöscht.

    ich baue gerade nen MPEG-Header-Editor ein...mit dem man header laden, speichern und edieren kann...für was auch immer das gut ist....ich fand das als feature nicht schlecht.

    es ist das gleiche ergebnis.


    ich lese 10 bytes ein. ich habe es auch mit einem byte versucht. gleiches ergebnis.

    ich habe das jetzt mal nach meinem verständnis umgebaut....gleiches ergebnis

    VB.NET-Quellcode

    1. If rbWriteOption2.Checked = True Then
    2. Dim fsr As IO.FileStream
    3. Dim fsw As IO.FileStream
    4. 'Dim tmpFile As String = IO.Path.GetTempPath
    5. Dim tmpFile As String = "F:\1.mp3"
    6. KillFile(tmpFile, False)
    7. fsr = New IO.FileStream(file.FullName, IO.FileMode.Open, IO.FileAccess.Read)
    8. fsw = New IO.FileStream(tmpFile, IO.FileMode.Create, IO.FileAccess.Write)
    9. fsr.Position = 0
    10. If fPos > 0 Then
    11. For p = 0 To fPos - 1
    12. fsw.WriteByte(fsr.ReadByte())
    13. Next
    14. End If
    15. fsw.Close()
    16. fsr.Close()
    17. End If


    ausgabe ist eine textdatei mit inhalt: "¥¸—FŠht\R,"


    komischer weise in einem anderen sub funktioniert das einwandfrei:

    VB.NET-Quellcode

    1. Private Sub butHeaderSave_Click(sender As Object, e As EventArgs) Handles butHeaderSave.Click
    2. Dim sFile As String
    3. Dim success As Boolean = False
    4. sFile = fileDialogSaveFile("MPEG Header speichern",
    5. "MPEG Header-Datei|*.MPEGh")
    6. Dim bytes() As Byte = MPEGheaderToByteArr(txtHeaderOld.Text)
    7. If sFile.Length <> 0 Then
    8. If KillFile(sFile, False) = True Then
    9. Using bw As IO.BinaryWriter = New IO.BinaryWriter(IO.File.Open(sFile, IO.FileMode.Create))
    10. For Each value As Byte In bytes
    11. bw.Write(value)
    12. Next
    13. End Using
    14. success = True
    15. End If
    16. If success = False Then
    17. Message("Fehler beim speichern der Datei.")
    18. End If
    19. End If
    20. End Sub


    das gibts keine probleme

    ich habe das gerade nochmal umgebaut:

    VB.NET-Quellcode

    1. Dim tmpFile As String = "F:\1.mp3"
    2. KillFile(tmpFile, False)
    3. Using fsr As New IO.FileStream(file.FullName, IO.FileMode.Open, IO.FileAccess.Read)
    4. Using fsw As New IO.FileStream(tmpFile, IO.FileMode.Create, IO.FileAccess.Write)
    5. fsr.Position = 0
    6. If fPos > 0 Then
    7. For p = 0 To fPos - 1
    8. fsw.WriteByte(fsr.ReadByte())
    9. Next
    10. End If
    11. End Using
    12. End Using
    13. End If


    gleiches ergebnis...eine textdatei....ich habe es auch mit ner anderen datei versucht....es ist immer ne textdatei


    ich habe mal testweise folgendes probiert:

    VB.NET-Quellcode

    1. byt = IO.File.ReadAllBytes(file.FullName)
    2. IO.File.WriteAllBytes(tmpFile, byt)


    das funktioniert....war die gleiche datei.

    komischer weise geht jetzt auch der andere code auf einmal....ich habe nichts verändert.
    jetzt gehts...

    großes ?

    ganz vergessen: DANKE für eure antworten & danke fürs lesen ;)

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „woeh“ ()

    woeh schrieb:

    VB.NET-Quellcode

    1. If success = False Then
    Was müsste denn in Deinem Code passieren, damit der Programmfluss NICHT an der Zeile success = True vorbeikommt?
    Ist diese Abfrage und damit das Flag ühaupt sinnvoll?
    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!
    naja....falls eine vorhandene datei die vorher existierte nicht gelöscht werden kann würde success = False sein. Würde eine vorhandene Datei erfolgreich gelöscht werden, würde geschrieben & success = True.

    das False bei KillFile ist nur dazu da um festzulegen ob eine Meldung beim erfolgreichen löschen ausgegeben werden soll.

    oder denke ich wieder zu umständlich ?

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

    woeh schrieb:

    ausgabe ist eine textdatei mit inhalt: "¥¸—FŠht\R,"

    Hallo! Ich denke es ist alles ok... klar... wenn Du eine mp3-Datei mit einem Texteditor öffnest, dann zeigt er dir irgendwelche Zeichen an. Ist auch klar... Die in der Datei enthaltenen Bytes werden als ASCII-Zeichen interpretiert. Wenn Du die Datei mit einem Malprogramm öffnest, wirst Du auch irgend ein gekritzel sehen... Und wenn Du sie mit einem Audioplayer öffnest wirst Du vermutlich was hören... Es kommt auf die interpretation der Daten an!
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    Dann lieber sowas wie Notepad++ mit Hex-Editor Plugin. Der macht keinen Autoerkennungs-Müll mit der Datei sondern zeigt sie so an wie sie vorliegt. Na gut, er versucht zu erkennen ob er für eine Sprache Syntax-Highlighting aktivieren kann, aber das wars dann auch schon. Ist ein wunderbares, erweiterbares Allround-Tool.
    @woeh Falsch. Wir kennen dich nicht. Wir wissen weder wie alt du bist, noch was du sonst so machst, oder wie lange du schon Programmierst, oder wie lange du schon mit dem PC erfahrung hast. Das Interessiert uns aber auch nicht. Alles was uns interessiert, ist das was du uns präsentierst. Desto weniger informationen wir haben, desto wilder werden die Spekulationen, desto grundlegender die Tips und Hinweise die wir geben. Das ist keine Form von diskriminierung oder sonstigem, sondern der ernste Wille jemandem zu helfen, dessen Wissensstand wir nicht mal annähernd erahnen können. Daher oftmals die Posts mit "zeige mehr eigeninitiative" usw. Der Hilfesuchende muss den Helfenden dabei helfen ihm zu helfen.
    Das denke ich mir. ;)
    Da wir hier auf dem Board nicht nur Leute haben, die seit jahren Programmieren, sondern oft auch totale Anfänger, können wir einfach nicht davon ausgehen, das Person X für Problem Y schon alle Lösungen durchprobiert hat, die einem auf die Schnelle in den Sinn kommen würden. Wir müssen daher alles vorschlagen, was der Fragensteller nicht erwähnt hat. Genau aus dem Grund habe ich auch z.B. NPP vorgeschlagen, denn aus bisheriger Sicht hat dein Editor wohl ab und zu ein Problem die Audiodateien von Textdateien zu unterscheiden, aus welchen Gründen auch immer. Mit NPP hätte man halt immer die Option auf HEX umzuschalten, und nicht abhängig vom erkannten "Dateityp".
    also: ich bin 47 und beschäftige mich mit computer seit den 80er, seit damals die homecomputer rauskamen. es gab ab und zu ein jahr pause....aber seitdem bin ich dabei. programmieren habe ich damals unter vb6 gelernt und es war zeit was anderes auszuprobieren.

    ich habe mir das selber alles beigebracht...und das heißt, das ich nicht nur die ganze zeit gespielt habe.

    ich bin sicher kein guru...aber ein blutiger anfänger bin ich nun auch nicht.

    ich sage ja immer: ich habe noch viel zu lernen.

    woeh schrieb:

    ich bin sicher kein guru...aber ein blutiger anfänger bin ich nun auch nicht.
    Dann zeig uns das, indem du bei deinem nächsten Eröffnungspost alle Karten auf den Tisch legst.
    Bsp. : Hättest du uns direkt gesagt, dass du den Header einer mp3 Datei editieren und wieder speichern willst, wären hier weniger posts entstanden und du hättest dich nicht wie ein Anfänger behandelt gefühlt.

    woeh schrieb:

    ich denke mir nicht, das es ein problem von dem editor war.
    MP3 als Text und MP3 als Hex-Dump, ich musste allerdings die Extension ändern:

    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!
    Zum mp3-Tag editieren gibts übrigens 'ne Menge Vorlagen im INet, google mal mp3-Editor oder Mp3Editor etc. Oder Id3-Tag Mp3
    Da ist BinaryReader auch genau angemessen, son Id3-Tag besteht aus Text, Chars, Bytes - um das differenziert einzulesen ist BinaryReader das richtige, mit all seinen vielen Read-Methoden.