Hallo zusammen,
ich habe hier den untenstehenden Code gefunden zur Berechnung einer
Checksumme (CRC-16), allerdings bekomme ich in den beiden Bytes des
Ergebnisses jeweils nur eine "1".
Was mache ich falsch? Wenn ich aus 3 Bytes einen CRC-Wert ermitteln
möchte, muss ich die Funktion doch einfach nur 3x aufrufen:
DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert1,0xA001);
DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert2,0xA001);
DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert3,0xA001);
Die beiden Bytes frage ich mit DEVICE_CRC16.low8 bzw. DEVICE_CRC16.high8
ab. Bei den Deklarationen von Wert1-3 habe ich bereits alles probiert
(uns16/ uns8, char) - am Ergebnis hat es nichts geändert.
Außerdem glaube ich nicht dass das Polynom A001 (bzw.
"1010000000000001") dem Polynom von CRC16 entspricht...
Kennt sich hier jemand gut aus?
Grüße
Olaf
//- calcCRC16r ------------------------------------------------------
unsigned int calcCRC16r(unsigned int crc, unsigned int c, unsigned int
mask)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((crc ^ c) & 1) { crc=(crc>>1)^mask; }
else crc>>=1;
c>>=1;
}
return (crc);
}
//-------------------------------------------------------------------
Aufruf der Funktion im Programm:
{
//...
unsigned int DEVICE_CRC16=0;
DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,chr,0xA001);
//...
}
Gast
#1176302
Ja. Mein code :
PROCEDURE calcCRCbyte(data:BYTE;VAR crc:WORD);
VAR i:BYTE;
BEGIN
FOR i:=0 TO 7 DO BEGIN
IF ((data and $01)XOR(crc AND $0001)<>0) THEN BEGIN
crc:=crc shr 1;
crc:= crc XOR $A001;
END
ELSE BEGIN
crc:=crc shr 1;
END;
data:=data shr 1;
END;
END;
Deiner scheint etwas kuerzer zu sein, dh etwas wegzulassen.
Hier einer in C: HEADER:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
IMPLEMENTATION:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.