CRC16 für Datenpaket berechnen. Wie mach ich das?

  • Hallo... ich frag einfach auch mal hier...


    Die Datenpakete, die ich grad mitlese, enthalten eine 2 Bytes lange Prüfsumme. Wie kann ich die selber erstellen?


    Ich vermute, dass es sich um CRC16 handelt. Eine einfache Summe ist es nicht, und auch XOR scheidet aus.


    Hat jemand Erfahrung mit sowas?

  • http://de.wikipedia.org/wiki/Cyclic_Redundancy_Check


    Was willst du genau haben/machen? Von Hand ausrechnen? Ein Programm, das das für dich macht? Die Prüfung selbst in einem Programm implementieren?


    Hatte zwar selbst mal ne Vorlesung wo das vorkam, aber implementiert habe ich das noch nie selbst. IMHO sollte es für die meisten Programmiersprachen auch schon fertige Bibliotheken dafür geben. Qt kann das zum Beispiel.

  • Danke für den Link. Eigentlich will ich nur gültige Datenpakete "verfasssen", die dann meine PCMCIA-Karte versteht. Der bisher analysierte Datenstrom deutet auf immer gleich lange Pakete hin, die alle im drittletzten und vorletzten Byte eine Prüfsumme enthalten. Ich vermute CRC16... aber sicher bin ich mir selbst dabei nicht ganz.


    Das, was ich bisher programmiert habe, kommt zu anderen Ergebnissen. Entweder hab ich mich verprogrammiert, oder es liegt ein herstellerspezifisches Format vor, und die Prüfung ist nicht wirklich eine CRC16. :-(

  • Ich sag einfach mal nein, auch wenn ich davon nicht wirklich Ahnung hab. :-)
    Ich bild mir ein, Ethernet-Pakete haben einiges mehr an Verwaltungsinformationen...


    Die Pakete in meinem Fall haben alle einen 4 Byte langen Header, dann kommen gleich die Nutzdaten. Jedes Paket endet mit 0x7e. Beispiel:


    4B 32 03 00 41 54 45 30 0D 00 00 00 00 00 00 00 K2..ATE0........
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    (usw.)
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    00 00 00 00 05 00 00 00 2E 8B 7E .........~

  • Hi,
    ich beschäftige mich auch gerade mit CRC16
    Prüfsummen.
    Bist Du schon fündig geworden?
    Ich suche ein Code mit dem ich solch eine
    Check Summe mit Visual Basic berechnen kann.


    gruss Sio

  • Hallo Sio,
    leider scheinen die in meinem Fall ein anderes Genaratorpolynom zu verwenden, das ich erstmal rausknobeln muss. Vielleicht ist es auch gar kein CRC16, denn die üblichen CRC16-Prozeduren kommen zu keinem Ergebnis. Oder aber, ich bin einfach zu doof. :-)


    VB kenn ich leider zu wenig, aber ich kann dir einen C-Programm-Schnippsel anbieten:


    unsigned long crc(char* text, unsigned long tlen) {
    // text[]: Bytefolge, über die die Berechnung durchgeführt werden soll;
    // tlen: Länge der Bytefolge;
    // Rückgabe: CRC16-Prüfsumme;
    unsigned int i,j;
    unsigned long cr,mask;


    cr= 0xffff;
    i= 0;
    while(i<tlen) { // für alle Bytes
    cr^= ((unsigned char*)text)[i];
    for(j= 1; j<=8; j++) {
    mask= 0;
    if((cr&1)!=0)
    mask= 0xa001;
    cr>>= 1;
    cr^= mask;
    }
    i++;
    }
    return cr;
    }


    Müsstest eventuell in VB umarbeiten...
    Gruß Baser

  • Hi,
    vielen vielen Dank für den Link.
    Habe den Code mal kopiert und laufen lassen.
    Er meckert zwar nicht, aber wo kann ich denn jetzt
    dort eine Eingabe machen.

  • Du hast den C-Code in VB zum laufen bekommen? Als Parameter musst du ein Char-Array und eine Länge angeben, zurück bekommst du die Checksumme.


    Aber wie schon geschrieben, es handelt sich hierbei um eine C-Funktion die auch nur in C funktioniert. Es ist kein Programm oder ähnliches.

    -> Tristan @ Work <-
    --

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!