CRC berechnen nach CCITT XModem (CRC16C) wie?

  • VB.NET

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

    CRC berechnen nach CCITT XModem (CRC16C) wie?

    Hallo,

    ich hoffe mir kann jemand helfen bzw. geholfen werden.

    Ich suche schon seit mehreren Tagen nach einer Möglichkeit aus einem Byte Array die CRC nach CCITT XModem zu berechnen.

    Polynom = 0x1021
    Startwert = 0x0000

    Ich bin noch nicht fündig geworden. Das meiste was ich gefunden habe waren C Programme, die habe ich versucht umzuschreiben aber irgendwie klappt nichts.

    Hier lammertbies.nl/comm/software/index.html gibt es die beispiele in C aber ich bringe es nicht auf die Reihe.
    Hier lammertbies.nl/comm/info/crc-calculation.html kann man sich die CRC auf verschiedene Arten berechnen lassen.
    Und hier cs.princeton.edu/introcs/51data/CRC16CCITT.java.html gibts was in Java.

    Was ich an der ganzen Sache auch nicht verstehe ist folgendes:
    Wenn man das Polynom hat dann, braucht man keine CRC Tabelle? Wenn man eine CRC Tabelle hat, dann braucht man für die Berechnung das Polynom nicht?
    Wenn man das mit einer CRC Tabelle lößt, dann ist die Berechnung schneller?

    Wenn jemand mir helfen könnte wäre ich sehr sehr sehr!!! dankbar.

    VB.NET-Quellcode

    1. Dim crc As Integer = &Hffff
    2. ' initial value
    3. Dim polynomial As Integer = &H1021
    4. ' 0001 0000 0010 0001 (0, 5, 12)
    5. ' byte[] testBytes = "123456789".getBytes("ASCII");
    6. Dim bytes As Byte() = args(0).getBytes()
    7. For Each b As Byte In bytes
    8. For i As Integer = 0 To 7
    9. Dim bit As [boolean] = ((b >> (7 - i) And 1) = 1)
    10. Dim c15 As [boolean] = ((crc >> 15 And 1) = 1)
    11. crc <<= 1
    12. If c15 Xor bit Then
    13. crc = crc Xor polynomial
    14. End If
    15. Next
    16. Next
    17. crc = crc And &Hffff

    ich hab den Java Code genommen ein wenig geändert(System.out... weggemacht und die For schleife in for each geändert...) und mit dem C# Convertor von developerfusion konvertiert...deshalb geb ich jetzt keine Garantie darauf, dass keine Fehler drinne sind ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Alter Schwede,

    das funktioniert prima!!!!!!!!!!!!!!!!!!!!!! 10000x Danke!

    Musste nur noch den Startwert auf &H0 setzen, die Zeile

    VB.NET-Quellcode

    1. Dim bytes As Byte() = args(0).getBytes()
    hab ich mal testweise in

    VB.NET-Quellcode

    1. Dim bytes As Byte() = {&HB, &H0, &HFF}
    abgeändert, dann gings!

    Ich bekomme das gleiche Ergebnis wie auf lammertbies.nl/comm/info/crc-calculation.html

    Du hast mich gerettet! :thumbsup:

    edit: ich habe es jetzt so abgeändert

    VB.NET-Quellcode

    1. Dim crc As Integer = &H0 'Startwert = 0
    2. Dim Polynom As Integer = &H1021
    3. Dim bytes As Byte() = {&HB, &H0, &HFF}
    4. Dim bit As Boolean
    5. Dim c15 As Boolean
    6. Dim i As Integer
    7. For Each b As Byte In bytes
    8. For i = 0 To 7
    9. bit = ((b >> (7 - i) And 1)) '= 1)
    10. c15 = ((crc >> 15 And 1)) '= 1)
    11. crc <<= 1
    12. If c15 Xor bit Then
    13. crc = crc Xor Polynom
    14. End If
    15. Next
    16. Next
    17. crc = crc And &HFFFF


    Wenn mir das noch einer erklären könnte wäre es perfekt:

    Die for each Schleife. Was soll das was ich auskommentiert ('=1) habe bewirken, denn es geht auch wenn es auskommentiert ist?
    Bei jvbsl stand Dim bit As [Boolean] ich habe es geändert in Dim bit As Boolean es ging mit beiden Deklarationen, ich kenne diese Art der Deklaration nicht [Boolean]
    Danke wenn sich einer dieser Aufgabe annimmt

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