tHex Zeichen in Strings

  • VB.NET

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

    tHex Zeichen in Strings

    Hallo,

    ich habe ein Problem beim Verarbeiten von Strings, die Hex-Zeichen enthalten, in diesem Fall die Zeichenfolge "vbCrLf".

    VB.NET-Quellcode

    1. Const DELIM As Char = Chr(0)
    2. strEntry(1) = "URL" & DELIM & "Telefon" & vbCrLf & "999-12346" & DELIM


    Der zweite String entsteht wie folgt:

    VB.NET-Quellcode

    1. strField = strEntry(1).Split(DELIM)
    2. txtType.Text = strField(0)
    3. txtInfo.Text = strField(1)
    4. strHoldEntry = txtType.Text & DELIM & txtInfo.Text & DELIM


    Die beiden Strings sollten gleich sein (und sehen im Debugger auch gleich aus). Aber sie sind nicht gleich:

    VB.NET-Quellcode

    1. If strEntry(1) <> strHoldEntry Then
    2. blnChanged = True


    Diese If Bedingung ist erfüllt. Wenn ich den String vbCrLF entferne, dann klappt die Sache. Die Low-Values (Hex00) spielen dabei wohl keine Rolle.

    Weiß jemand, was ich falsch mache?

    Wie kann man denn einen String hexadezimal ausgeben, damit ich sehen kann wo die beiden Strings sich denn nun unterscheiden?

    Gruß
    Peter
    Mir ist schon klar, dass vbCrLf die beiden Hex Zeichen für "Wagenrücklauf" und "Neue Zeile beinhaltet.

    Das mit dem vbCrLf im Text ist aber nicht meine Idee. Ich hab das Problem vereinfacht dargestellt. Es handelt sich um die Eingaben der User. Die geben ihre Daten in das Feld txtInfo.Text per Bildschirm ein. Und da sollen sie eben die Möglichkeit haben mit RETURN mehrere Zeilen einzugeben. Vielleicht sollte ich erwähnen, dass txtInfo ein "rich Text" Feld ist, da ist so etwas erlaubt.

    Ich vermute mal, das mein Problem damit zusammenhängt. Meine Versuche die Daten mit der folgenden Funktion hexadezimal darzustellen haben zu sehr merkwürdigen Ergebnissen geführt:

    VB.NET-Quellcode

    1. Public Function StrToHex(ByRef Data As String) As String
    2. Dim sVal As String
    3. Dim sHex As String = ""
    4. While Data.Length > 0
    5. sVal = Conversion.Hex(Strings.Asc(Data.Substring(0, 1).ToString()))
    6. Data = Data.Substring(1, Data.Length - 1)
    7. sHex = sHex & sVal
    8. End While
    9. Return sHex
    10. End Function


    Das Ausgabe eines normalen Strings ist völlig in Ordnung.

    Die Ausgabe eines Strings mit vbCrLf führt zu einer UNGERADEN Anzahl von Halbbytes. Das dürfte nicht den Tatsachen entsprechen! *g*

    Gruß
    Peter

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    naja, manche chars werden von Strings.Asc() wohl zu Werten > 255 umgewandelt, und dafür braucht man dann 3 Hex-Ziffern.
    böse Funktionen vermeiden

    probierma

    VB.NET-Quellcode

    1. Public Function StrToHex(Data As String) As String
    2. Dim bytes = System.Text.Encoding.ASCII.GetBytes(Data)
    3. Return BitConverter.ToString(bytes)
    4. End Function
    Wow, mit vbLf hast du den Nagel auf den Kopf getroffen. Jetzt flutscht die Sache.

    Ich habe eine vage Idee, warum das so ist. Ich hab die Daten mal char/hex angezeigt:

    VB.NET-Quellcode

    1. Debug.Print(strEntry(intRecordNo)) '*** TEST ***
    2. Debug.Print(strHoldEntry)
    3. strHex1 = StrToHex(strEntry(intRecordNo))
    4. strHex2 = StrToHex(strHoldEntry)
    5. Debug.Print(strHex1)
    6. Debug.Print(strHex2)


    Als Delimiter hab ich mal der besseren Lesbarkeit halber ein $-Zeichen eingestellt. Das ist die Ausgabe:

    VB.NET-Quellcode

    1. ABC$T
    2. 1$
    3. ABC$T
    4. 1$
    5. 41 42 43 24 54 DA 31 24
    6. 41 42 43 24 20 A 31 24
    7. Eine Ausnahme (erste Chance) des Typs "System.IndexOutOfRangeException" ist in DatLock.exe aufgetreten.


    Der Zeilenumbruch wird mit beiden Strings korrekt angezeigt. Aber die Hex-Ausgabe ist unterschiedlich! Das Problem ist, dass das Zeichen "Cr" (13 = Hex D) "geschluckt" wird! Und mit der ungeraden Anzahl an Halbbytes kommt dann die Hex- Routine ins Schleudern!

    Warum das jetzt so ist, da fragt ihr mich besser nicht. Wenn man mir "vbLf" arbeitet, vermeidet man das böse Hex D ... und dann läuft es.

    Also, ganz herzlichen Dank an alle Ratgeber. Ihr habt mir eine schlaflose Nacht erspart! Mein Daumen ist oben! klick, klick ... !

    Gruß
    Peter
    tja, Richtextbox macht solche Probleme.
    Wenn man Enter hineinschreibt, entsteht vbLf, aber wennman mit Copy&Paste mehrzeiliges einpastet, kann auch vbCrLf in den Text gelangen.

    Die Zeilen einer Rtb ruft man glaub am Besten per Rtb.Lines ab - da bekommt man gleich ein String-Array.