Umwandeln einer Zahl in eine Zeichenkette

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Umwandeln einer Zahl in eine Zeichenkette

    Hallo!

    Ich habe eine Function geschrieben, mit der es möglich sein soll, eine Zahl in eine Zeichenkette umzuwandeln, das den Anwender erschweren soll, einen Wert in einem Spielstand zu manipulieren. Doch leider erscheint beim Umwandeln der Zahl 1775 folgende Fehlermeldung:

    System.NotSupportedException: "No data is available for encoding 1252. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method."

    Hier ist der Code:

    VB.NET-Quellcode

    1. Function ZahlAlsZeichen(ByVal Zahl As Integer) As String
    2. Dim ZeichenNr As Integer
    3. Dim Kette As String
    4. Dim Rest As Integer
    5. Kette = ""
    6. Rest = Zahl
    7. For i = 3 To 0 Step -1
    8. ZeichenNr = Int(Rest / 222 ^ i)
    9. If ZeichenNr = 0 Then Kette = Kette & "!" Else Kette = Kette & Chr(ZeichenNr + 34)
    10. Rest = Rest - ZeichenNr * 222 ^ i
    11. Next
    12. ZahlAlsZeichen = Kette
    13. End Function


    Im letzten Durchlauf dieser Schleife hat ZeichenNr den Wert 221. Rechnet man 34 dazu, erhält man 255. Beim der Anweisung Chr(ZeichenNr+34) tritt dieser Fehler auf. Doch Chr(255) sollte eigentlich ÿ ergeben. Oder kann VB dieses Zeichen nicht verarbeiten?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Selter98 schrieb:

    eine Zahl in eine Zeichenkette umzuwandeln, das den Anwender erschweren soll, einen Wert in einem Spielstand zu manipulieren
    Du möchtest eine Verschlüsselung selbst schreiben.
    Eine sehr rudimentäre Verschlüsselung wäre, wenn du die einzelnen Bytes mit XOR %X1F versiehst.
    Das ist ein umkehrbarer Vorgang und liefert lesbare Zeichen.

    Aber nimm lieber eine echte Verschlüsselung (z.B. AES) und wenn du es lesbar haben willst, verwandle das Ergebnis in einen Base64 String.
    Selbstgeschriebene Verschlüsselungen waren noch nie eine gute Idee.

    Edit: Verschlüsselung ist kein Hexenwerk, schrieb @SpaceyX hier:
    SMTP Zugangsdaten im Programm speichern
    Da kannst du abschreiben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Die Zeichenkette soll in einer ini-Datei gespeichert werden. Da werden die Steuerzeichen durch Fragezeichen ersetzt und führen zu einem Fehlerhaften Auslesen. Auch Leerzeichen und Anführungszeichen, besonders am Anfang einer Zeichenkette, können beim Auslesen ignoriert werden. Jetzt weiß ich nicht, ob die vorgegebene Verschlüsselung soetwas berücksichtigt.

    Selter98 schrieb:

    Die Zeichenkette soll in einer ini-Datei gespeichert werden

    Ein Base64-String besteht immer aus lesbaren Zeichen.
    Wenn du die von mir verlinkten Funktionen verwendest, bekommst du Base64-Strings.

    Selter98 schrieb:

    Leerzeichen und Anführungszeichen, besonders am Anfang einer Zeichenkette, können beim Auslesen ignoriert werden
    Wenn du sie tatsächlich nicht drin haben willst, musst du sie halt vor dem Verschlüsseln entfernen (mit Trim oder Replace).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Selter98 schrieb:

    Die Zeichenkette soll in einer ini-Datei gespeichert werden.
    Verwende lieber eine XML-Datei.
    Hier ein einfaches Beispiel für eine XML-Datenklasse mit eingebauter Serialisierung:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Imports System.Xml.Serialization
    4. ''' <summary>
    5. ''' Datenklasse
    6. ''' </summary>
    7. ''' <remarks>mit XML-Serialisierung</remarks>
    8. Public Class MyData
    9. ' Pfad zur geladenen Datei
    10. Private MyFile As String
    11. ' alle vorkommenden Daten
    12. Public Property name() As String
    13. Public Property address() As String
    14. Public Property type() As Integer
    15. Public Property timestamp() As DateTime
    16. Public Property flags() As Integer
    17. Public Property user() As String
    18. Public Property SingleValues() As List(Of Integer)
    19. Public Sub New()
    20. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    21. Me.name = "Hase"
    22. Me.SingleValues = New List(Of Integer)
    23. End Sub
    24. ''' <summary>
    25. ''' Daten aus einer Datei lesen
    26. ''' </summary>
    27. ''' <param name="file">Dateiname</param>
    28. ''' <returns>die geladene Instanz</returns>
    29. Public Shared Function LoadData(file As String) As MyData
    30. Dim data As New MyData()
    31. Try
    32. ' Deserialize XML file to a new object.
    33. Using sr As New StreamReader(file, Encoding.Default)
    34. Dim x As New XmlSerializer(data.GetType())
    35. data = DirectCast(x.Deserialize(sr), MyData)
    36. End Using
    37. ' Pfad merken
    38. data.MyFile = file
    39. Return data
    40. Catch
    41. ' nix tun, die Daten-Instanz ist nicht valid,
    42. ' es wird die Instanz übergeben, die bei New() erzeugt wird
    43. End Try
    44. ' Pfad bei nicht vorgandener Instanz merken
    45. data.MyFile = file
    46. Return data
    47. End Function
    48. ''' <summary>
    49. ''' Daten in eine Datei schreiben
    50. ''' </summary>
    51. Public Sub WriteData()
    52. ' Serialize object to a XML file.
    53. Using sw As New StreamWriter(Me.MyFile, False, Encoding.Default)
    54. Dim x As New XmlSerializer(Me.GetType())
    55. x.Serialize(sw, Me)
    56. End Using
    57. End Sub
    58. End Class
    Eine sehr einfache Verschlüsselung, die nach der Vorgabe von @petaod funktioniert, kannst Du gleich in die XML-Daten-Datei einbauen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private _Key() As Byte = {&HAA, &HBB, &HCC, &HDD, &HEE}
    2. Private _Len As Integer = _Key.Length
    3. Private Function Encrypt(s As String) As Byte()
    4. Return Encoding.UTF8.GetBytes(s).Select(Function(b, i) b Xor _Key(i Mod _Len)).ToArray()
    5. End Function
    6. Private Function Decrypt(bytes As Byte()) As String
    7. Return Encoding.UTF8.GetString(bytes.Select(Function(b, i) b Xor _Key(i Mod _Len)).ToArray())
    8. End Function
    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!
    Nun habe ich ein anderes Problem: Das Spiel enthält auch einen Kartensatz, bei dem jede Karte in Talon (als String definiert) mit einen Ascii-Zeichen versehen ist. Derzeit sind es 62 Karten. Aber wenn ich durch geplante Erweiterungen 94 Karten erreiche oder überschreite. triit wieder das oben genannte Problem auf. Mit der Anweisung

    VB.NET-Quellcode

    1. ​ChrW(KartenNr + 34)


    tritt zwar nicht die oben genannte Fehlermeldung auf, jedoch werden fast alle Zeichen jenseits der 127 als Fragezeichen oder garnicht in der Ini-Datei dargestellt, was wiederrum zu einem fehlerhaften auslesen führt. Wie kann ich die Ascii-Zeichen auch über dem 127. Zeichen hinaus sinnvoll nutzen?

    Selter98 schrieb:

    Wie kann ich die Ascii-Zeichen auch über dem 127. Zeichen hinaus sinnvoll nutzen?
    Verwende den .NET-Datentyp Char:
    learn.microsoft.com/de-de/dotn…data-types/char-data-type
    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!