Forum: PC-Programmierung [S] Hilfe CRC(16?) -> So verbreitet und doch zu schwer für mich.


von Michael B. (planlessmichi)


Lesenswert?

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 :-(

von Michael B. (planlessmichi)


Lesenswert?

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 
... :-(

von Isch (Gast)


Angehängte Dateien:

Lesenswert?


von Isch (Gast)


Lesenswert?

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

von Michael B. (planlessmichi)


Lesenswert?

@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
Noch kein Account? Hier anmelden.