Hallo zusammen, es ist soweit: Ich zweifle langsam an meinem Verstand. Zugegeben, bisher habe ich mit CRC-Berechnungen noch nicht viel zu tun gehabt, aber ich habe heute bereits den zweiten Tag damit verbracht und kapier das einfach nicht. Kurzes (obligatorisches) Vorwort: Selbstverständlich habe ich google etc. ausgiebig benutzt, sogar mit Freuden gesehen, dass es hier einen eigenen Artikel über CRC-Berechnungen gibt, aber ich kann meine Daten nicht nachvollziehen. Sämtliche Online-Rechner und Codebeispiele liefern mir andere Ergebnisse. Hintergrund: Ich habe ein Messgerät, dass mir über eine serielle Verbindung Daten schickt. Diese Daten sehen wie folgt aus (Zitat aus dem zugehörigen Manual): >Datenformat: >Ein Datenblock umfasst 12 Bytes, davon 10 Datenbytes und zwei CRC-Bytes. >Datenbyte Zuordnung > 0 Gerätekennung Low-Byte $E8 > 1 Gerätekennung High-Byte $03 > 2 Distanz Low-Byte > 3 Distanz High-Byte > 4 Füllhöhe Low-Byte > 5 Füllhöhe High-Byte > 6 Liter Low-Byte > 7 Liter High-Byte > 8 Inhalt in Prozent > 9 Zustand derAusgänge > 10 Kontrollbyte Low-Byte > 11 Kontrollbyte High-Byte Die Datenwürste, die ich von dem Messgerät bekomme, sehen nun z.B. so aus: 00 10 50 00 5D 00 3F 01 3F 00 B9 B1 Laut Herstellermail (da habe ich natürlich auch schon angefragt) ist die Anleitung für ein neueres Gerät, weshalb die ersten beiden Bytes bei mir (älteres Gerät) nicht 0xE8 und 0x03 sind. Der Rest würde aber wieder passen. Außerdem wurde mir da verraten, dass das "Generatorpolynom" den Wert 0x8005 hat. Somit müsste es sich also um eine CRC-16-IBM Berechnung handeln, mit "normaler" (nicht umgekehrter) Darstellung. Mein Problem: Ich bekomme bei keinem einzigen Onlinerechner und bei keiner einzigen Sourcecodeimplementierung meine beiden CRC-Bytes 0xB9 und 0xB1 raus. Oder verstehe ich das falsch? Mir das am obigen Beispiel meiner Daten mal vorzurechnen, wäre zwar ein Traum, aber auch viel zu aufwendig und daher hoffe ich gar nicht erst drauf; aber vielleicht hat jemand mal eine Implementierung gesehen, die mit den obigen Daten gefüttert, genau diese CRC-Bytes berechnet. Dann wäre zumindest schon mal "gesichert", dass es sich wirklich um eine CRC-16-IBM Berechnung handeln würde. Ach ja, als Startwert habe ich sowohl 0x0000, als auch 0xFFFF probiert; kam trotzdem immer was anderes raus. Ich wäre wirklich sehr froh, wenn mir hierbei jemand helfen könnte. Vielen Dank im voraus und viele Grüße, Michael PS: Ich habe auch mal versucht, jeweils nur das ungerade (oder gerade) Byte zu verwenden -> Klappte auch nicht :-(
Noch was: Wieso fangen eigentlich alle Beispiele immer mit einer 1 an? Wie berechnet sich so ein Ding, wenn da vorne mal eine 0 steht? Die verschwindet ja dann nie, oder? Ach Herr, wirf Hirn vom Himmel; davon brauche ich wohl noch sehr viel ... :-(
Oder wenn einem zwischendurch mal langweilig ist.
1 | isch@isch-laptop:~$ ./a.out |
2 | 000000000001000001010000000000000101110100000000001111110000000100111111000000000000000000000000 |
3 | |
4 | 0000000000010000010100000000 |
5 | 11000000000000101 |
6 | |
7 | 10000101000001010 |
8 | 11000000000000101 |
9 | |
10 | 10001010000011110 |
11 | 11000000000000101 |
12 | |
13 | 10010100000110110 |
14 | 11000000000000101 |
15 | |
16 | 10101000001100110 |
17 | 11000000000000101 |
18 | |
19 | 11010000011000110 |
20 | 11000000000000101 |
21 | |
22 | 0010000011000011101 |
23 | 11000000000000101 |
24 | |
25 | 10000110000110001 |
26 | 11000000000000101 |
27 | |
28 | 10001100001101001 |
29 | 11000000000000101 |
30 | |
31 | 10011000011011000 |
32 | 11000000000000101 |
33 | |
34 | 10110000110111011 |
35 | 11000000000000101 |
36 | |
37 | 11100001101111100 |
38 | 11000000000000101 |
39 | |
40 | 010000110111100100 |
41 | 11000000000000101 |
42 | |
43 | 10001101111000010 |
44 | 11000000000000101 |
45 | |
46 | 10011011110001110 |
47 | 11000000000000101 |
48 | |
49 | 10110111100010110 |
50 | 11000000000000101 |
51 | |
52 | 11101111000100110 |
53 | 11000000000000101 |
54 | |
55 | 010111100010001100 |
56 | 11000000000000101 |
57 | |
58 | 11111000100010010 |
59 | 11000000000000101 |
60 | |
61 | 011100010001011111 |
62 | 11000000000000101 |
63 | |
64 | 010001000101101011 |
65 | 11000000000000101 |
66 | |
67 | 10010001011011101 |
68 | 11000000000000101 |
69 | |
70 | 10100010110110001 |
71 | 11000000000000101 |
72 | |
73 | 11000101101101000 |
74 | 11000000000000101 |
75 | |
76 | 000010110110110100000 |
77 | 11000000000000101 |
78 | |
79 | 11101101101001010 |
80 | 11000000000000101 |
81 | |
82 | 010110110100111110 |
83 | 11000000000000101 |
84 | |
85 | 11101101001110110 |
86 | 11000000000000101 |
87 | |
88 | 010110100111001111 |
89 | 11000000000000101 |
90 | |
91 | 11101001110010101 |
92 | 11000000000000101 |
93 | |
94 | 010100111001000011 |
95 | 11000000000000101 |
96 | |
97 | 11001110010001101 |
98 | 11000000000000101 |
99 | |
100 | 00011100100010000000 |
101 | 11000000000000101 |
102 | |
103 | 010010001000010100 |
104 | 11000000000000101 |
105 | |
106 | 10100010000100010 |
107 | 11000000000000101 |
108 | |
109 | 11000100001001110 |
110 | 11000000000000101 |
111 | |
112 | 000010000100101100000 |
113 | 11000000000000101 |
114 | |
115 | 10001001011001010 |
116 | 11000000000000101 |
117 | |
118 | 10010010110011110 |
119 | 11000000000000101 |
120 | |
121 | 10100101100110110 |
122 | 11000000000000101 |
123 | |
124 | 11001011001100110 |
125 | 11000000000000101 |
126 | |
127 | 00010110011000110000 |
128 | 11000000000000101 |
129 | |
130 | 11100110001101010 |
131 | 11000000000000101 |
132 | |
133 | 010011000110111100 |
134 | 11000000000000101 |
135 | |
136 | 1011000110111001 = 0xB1B9 |
@Isch: Tausendmal dickes Dankeschön! Für beide Antworten! Den Onlinerechner bei breitbandkatze hatte ich auch schon ausprobiert, aber da ist der Trick wohl das Prozentzeichen, damit der das als binäre Zahl ansieht, oder? Das habe ich nicht gemacht. Und die ausführliche Berechnung: Da ist ja wirklich mal ein Traum wahr geworden :-) Nochmals vielen Dank. Ganz wichtig für mich ist hier z.B., dass ich jetzt gesehen habe, dass man anscheinend führende Nullen ignorieren muss. Ich hatte halt immer vorne angefangen und durch dieses XOR ist die erste eins (vom Polynom) dann nie verschwunden. Jetzt kann ich das a) nachvollziehen und b) sicher sein, dass es sich bei der angegebenen CRC-Summe wirklich um eine CRC-16-IBM handelt. Also: Ganz ernsthaft: Vielen, vielen Dank! Viele Grüße, Michael
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.