CRC-Berechnung in C
Ich habe ein Gerät, das sendet mir die Daten mit CRC-Berechnung.
Alle 16 Bytes gibt es 2 CRC-Bytes.
Das generator-Polynom x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1
Mein code sieht wie folgt aus:
int crc16(unsigned char *addr, int num, int crc)
{
uint16_t poly = 0x3D65;
int i;
for (; num > 0; num--) /* Step through bytes in memory */
{
crc = crc ^ ((unsigned short)*addr++ << 8); /* Fetch byte from memory, XOR into CRC top byte*/
for (i = 0; i < 8; i++) /* Prepare to rotate 8 bits */
{
if (crc & 0x10000) /* b15 is set... */
crc = (crc << 1) ^ poly; /* rotate and XOR with XMODEM polynomic */
else /* b15 is clear... */
crc <<= 1; /* just rotate */
} /* Loop for 8 bits */
crc &= 0xFFFF; /* Ensure CRC remains 16-bit value */
} /* Loop until num=0 */
return(crc); /* Return updated CRC */
}
Ich hab auch schon versucht diesen code mit anderen Polynome wie 0x9CB2. Ich denke, dass es ein Fehler liegt im code.
- Und Ihre Frage ist .... was genau?
- Können Sie erläutern, wie mehr die Frage, bitte? sagen Sie uns, wo genau das problem liegt...
- Ok, also Sie denken, dass es ein Fehler im code. Aber warum denken Sie, dass? Was genau funktioniert nicht? Die falsche Ergebnisse erhalten Sie?
- Warum tun Sie speichern in einem byte in ein 16-bit-und XOR-Verknüpfung mit dem ms-byte? Dies scheint sehr seltsam zu mir.
- Wie funktioniert die Dokumentation des Gerätes beschreiben die CRC-neben dem Polynom? Die CRC-bits gespeichert werden können in beliebiger Reihenfolge, es könnte sein, ein Anfangswert von null Verschieden, und es könnte sein, pre und/oder post-Klimaanlage. Lesen Sie ross.net/crc/download/crc_v3.txt .
- Können Sie ein Beispiel geben von 16 bytes Daten und 2 byte crc von dem Gerät?
- Kann man den online live CRC-calculator generieren, die gleiche CRC wie Sie Ihr Gerät?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem compiler/Plattform verwenden Sie? Sind Sie sicher, dass die
int
Datentyp ist 32 bit? Versuchen Sie es mitlong
und vergleichen Sie die Ergebnisse.Auch, es ist ein Punkt, in dem Sie die folgenden if:
und in dem Kommentar, den du Zustand, die Sie überprüfen 15ten bit. Nein, das ist nicht wahr, Sie werden überprüfen der 16 bit. Für die 15-es wäre
( crc & 0x8000 )
.if(crc >> 15)
es wird also deutlich, was der code tut.