ASCII-String hexadezimal interpretieren und einzelne Nibbel XOR verknüpfen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von roepke.

    ASCII-String hexadezimal interpretieren und einzelne Nibbel XOR verknüpfen

    Hallo,

    ich probiere jetzt schon fast einen ganzen Tag rum, komme aber auf keinen grünen Zweig und drehe mich scheinbar im Kreis.
    Für eine Prüfsummenbildung führe ich zur Zeit mit den "bösen" VB Funktionen folgendes durch:

    VB.NET-Quellcode

    1. Function mod_General_GenerateChecksum(ByVal sData As String) As String
    2. Dim Checksum As String = CStr(0)
    3. For k = 1 To Len(sData)
    4. Checksum = Hex("&H" & Hex(Asc(Mid(sData, k, 1))) Xor "&H" & Checksum) 'XOR Verknüpfung der Nutzdaten
    5. Next k
    6. If Checksum.Length = 1 Then
    7. Checksum = "0" & Checksum 'Wenn die Prüfumme einstellig ist muss eine 0 vorgestellt werden
    8. End If
    9. Return Checksum 'Rückgabe von 1 Byte ASCII
    10. End Function


    Dabei wird der übergebene String (z.B.: "123ABC") zeichenweise zunächst als hexadezimales ASCII Zeichen verstanden und dann mit dem nächsten XOR verknüpft.

    "1" XOR "2" XOR "3" XOR "A" XOR "B" XOR "C"
    0x31 XOR 0x32 OXR 0x33 XOR 0x41 XOR 0x42 XOR 0x43 = 0x70

    Wie werde ich die "bösen" VB Funktionen los?
    Lese ich den String z.B. in ein Byte-Array

    VB.NET-Quellcode

    1. Dim bytes() As Byte = System.Text.Encoding.ASCII.GetBytes(sData)

    wird dieses immer dezimal interpretiert.
    Ich brauche aber die HEX Entprechung des jeweiligen ASCII Zeichens
    Du wandelst hin und her. Aber ich glaube nicht, dass das nötig ist.
    Ich bin hierbei rausgekommen:

    VB.NET-Quellcode

    1. Private Function GetChecksumTextFrom(Data As String) As String
    2. Dim Checksum = 0
    3. For Each Character In Data
    4. Checksum = Convert.ToInt32(Character) Xor Checksum
    5. Next
    6. Dim ChecksumText = Checksum.ToString("X")
    7. If ChecksumText.Length = 1 Then Return "0" & ChecksumText
    8. Return ChecksumText
    9. End Function
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @roepke Wenn die Data als Hex-String vorliegen, kannst Du sie so in einen Integer konvertieren:

    VB.NET-Quellcode

    1. Dim data = "0xfe"
    2. Dim value = Convert.ToInt32(data.SubString(2), 16)
    3. MessageBox(value.ToString()
    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!
    Vielen Dank für die Hilfe.
    @VaporiZed: Richtig, dieses viele hin und her gewandel ist total unnötig. Deswegen habe ich mich auch im Kreis gedreht. Ich wollte auf Teufel komm raus die Eingansgwerte als hexadezimale ASCII Zeichen sehen, dabei können diese genauso gut als dezimale ASCII Character betrachtet und erst am Schluss in Hex gewandelt werden. Jetzt wo ich's vor mir sehe ist es total klar.