Text-Encodierungs-Grütze mit einer Priese Base64

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Mircosofter2206.

    Text-Encodierungs-Grütze mit einer Priese Base64

    Hallöchen Allerseits,
    ich hab in meinem Programm, dessen Funktion es ist "Sprite"-Dateien in einer Konsole anzuzeigen, zu laden und zu speichern.

    Dabei sieht so eine "Sprite-Datei" so aus:

    Quellcode

    1. BatchRenderSprite|IAAwAHwAMAB8ADQAfAAxADQA|IAAxAHwAMAB8ADQAfAAxADQA|IAAxAHwAMAB8ADQAfAAxADQA|...
    2. IAAwAHwAMAB8ADQAfAAxADQA(Base64) -> X0|0|4|1 (CharKoordinateX|KoordinateY|Hintergrundfarbe|Vordergrundfarbe)


    So wird das ganze geladen und gespeichert:

    VB.NET-Quellcode

    1. Shared Function FromFile(filename As String) As BatchRenderSprite
    2. Dim endresult As New BatchRenderSprite
    3. Try
    4. Dim filecontent As String = IO.File.ReadAllText(filename) 'Datei einlesen
    5. If Not filecontent.StartsWith("BatchRenderSprite│") Then 'BatchRenderSprite-Datei prüfen
    6. MsgBox("Keine BatchRender-Datei!")
    7. End If
    8. filecontent = filecontent.Replace("BatchRenderSprite|", "") 'Header entfernen
    9. Dim listofchars As String() = filecontent.Split("|") 'Datei in einzelne "Pixel"/einzelne Zeichen zerlegen
    10. Dim tempBatchRenderStack As New BatchRenderCharStack
    11. For Each element In listofchars
    12. Dim relive As String = System.Text.Encoding.Default.GetString(System.Convert.FromBase64String(element)) 'Das ganze Base64 dekodieren
    13. Dim tempnewchar As New BatchRenderChar
    14. tempnewchar.DrawChar = CChar(relive.Substring(0, 1)) 'Char auslesen
    15. relive = relive.Remove(0, 1) 'Char entfernen
    16. Dim Splitter As String() = relive.Split("|") 'restlicher Text zerlegen
    17. tempnewchar.Number = Splitter(0) 'X-Koordinate auslesen
    18. tempnewchar.Row = Splitter(1) 'X-Koordinate auslesen
    19. tempnewchar.BgColor = [Enum].Parse(GetType(ConsoleColor), Splitter(2)) 'Hintergrundfarbe auslesen
    20. tempnewchar.FrColor = [Enum].Parse(GetType(ConsoleColor), Splitter(3)) 'Vordergrundfarbe auslesen
    21. tempBatchRenderStack.Add(tempnewchar)
    22. Next
    23. endresult.Content = tempBatchRenderStack
    24. endresult.X = 0
    25. endresult.Y = 0
    26. Catch ex As Exception
    27. MsgBox("Keine BatchRender-Datei!")
    28. End Try
    29. Return endresult
    30. End Function
    31. Public Sub SaveFile(filename As String)
    32. Dim sb As New System.Text.StringBuilder
    33. sb.Append("BatchRenderSprite") 'Header, der angibt, dass es sich um ein BatchRenderSPrite handelt
    34. For Each element In Me.Content 'Für jeden "Pixel"/jedes Zeichen
    35. sb.Append("|")
    36. Dim tmpsb As New System.Text.StringBuilder
    37. tmpsb.Append(element.DrawChar) 'Char anhängen
    38. tmpsb.Append(element.Number.ToString & "|") 'X-Koordinate mit Seperator anhängen
    39. tmpsb.Append(element.Row.ToString & "|") 'Y-Koordinate mit Seperator anhängen
    40. tmpsb.Append(CInt(element.BgColor).ToString & "|") 'Hintergrundfarbe mit Seperator anhängen
    41. tmpsb.Append(CInt(element.FrColor).ToString) 'Vordergrundfarbe mit Seperator anhängen
    42. Dim encoded As String = System.Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(tmpsb.ToString)) 'Das ganze Base64-Kodieren
    43. sb.Append(encoded) 'Das ganze an die Datei anhängen
    44. Next
    45. If IO.File.Exists(filename) Then IO.File.Delete(filename) 'Datei Speichern
    46. Dim streamw As New IO.StreamWriter(filename)
    47. streamw.Write(sb.ToString)
    48. streamw.Flush()
    49. streamw.Close()
    50. streamw.Dispose()
    51. End Sub


    Bei "normalen" Chars wie z.B. A, B,C... geht das auch super! (Siehe Im anhang Bild Soos.png)

    Aber bei fremdzeichen wie bsp. ¬ bringt er immer Fehler! Ganz komisch! Hat jemand eine Idee, wo der Fehler liegt?
    Bilder
    • soos.png

      7,83 kB, 669×385, 101 mal angesehen

    Mircosofter2206 schrieb:

    Hat jemand eine Idee, wo der Fehler liegt?
    Ich bin mir jetzt nicht ganz sicher, aber Base64-String hat nur Zeichen im ASCII-Bereich (32 bis 127).
    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 schrieb:

    Ich bin mir jetzt nicht ganz sicher, aber Base64-String hat nur Zeichen im ASCII-Bereich (32 bis 127).


    Gute Frage, ich habe allerdings das Problem gelöst!
    Hab das

    Mircosofter2206 schrieb:

    System.Text.Encoding.Default.GetBytes(tmpsb.ToString)

    ein fach durch

    VB.NET-Quellcode

    1. System.Text.Encoding.GetEncoding(850).GetBytes(tmpsb.ToString)
    ersetzt, nun gehts! Das Problem war,
    dass die Konsole und diese Zeichen nur in Codepage 850 korrekt dargestellt werden, deshalb arbeitet er nun in der Codepage 850.

    Trotzdem Danke für deine Hilfe! :rolleyes: