Forum: Compiler & IDEs crc8 Tabelle Ich versteh es einfach nicht :(


von Hans (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab ein Problem.
Wenn ich von einem 0xff die crc Summe berechne bekomme ich 0xff.
Das kann noch nicht sein...

Soweit ich da verstehe wird die crc Tabelle richtig gebildet.
Aber die crc Summe wird falsch gebildet.

Ich find den Fehler einfach nicht. Steh grade auf dem Schlauch.

: Verschoben durch User
von Gustav (Gast)


Lesenswert?

Standardantwort für CRC-Berechnungen: http://www.zlib.net/crc_v3.txt

von Hans (Gast)


Lesenswert?

Hab ich schon gelesen.
Trotzdem bleibt die Birne dunkel...

von Erich (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

1
unsigned char p[] =
2
    { 0, 4, 5, 8 };   //
3
    unsigned int n, k;
4
5
    // make exclusive-or pattern from polynomial
6
    poly = 0;
7
    for ( n = 0; n < sizeof( p ) / sizeof(unsigned char) ; n++ )
8
        poly |= 1 << ( 7 - p[n] );

? Im 4. Durchlauf durch die Schleife
7 - 8 ergibt -1

was ergibt 1 << (-1)?
Gute Frage. Bin ich ehrlich gesagt überfragt, ob das definiert ist.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Karl Heinz schrieb:
> was ergibt 1 << (-1)?
> Gute Frage. Bin ich ehrlich gesagt überfragt, ob das definiert ist.

 0.
 Es sei denn, du arbeitest mit 256-bit uC.

: Bearbeitet durch User
von Tiramisu (Gast)


Lesenswert?

>> { 0, 4, 5, 8 }
Das "oberste" Bit ist immer implzit "1" in einem CRC Polynom,
das kann man in einem Byte mit den Bits 0-7 schlecht setzen,
IMHO mit sehr hoher Wahrscheinlichkeit falsch.

Die Polynomdarstellung ist ungewoehnlich "andersrum", aber das muss
nicht inkorrekt sein, massgeblich waere wie die Daten serialisiert
sind.

von Jasch (Gast)


Lesenswert?

Marc Vesely schrieb:
> Karl Heinz schrieb:
>> was ergibt 1 << (-1)?
>> Gute Frage. Bin ich ehrlich gesagt überfragt, ob das definiert ist.
>
>  0.
>  Es sei denn, du arbeitest mit 256-bit uC.

Unwahrscheinlich, 256 Bits oder nicht.

C99 sagt dazu: "If the value of the right operand is negative or is
greater than or equal to the width of the promoted left operand, the 
behavior is undefined."

Was immer konkret passiert, passiert, für den C-Standard ist's OK. Was 
in der wirklichen Welt passiert kann sich ganz real z.B. zwischen 
Compilerversionen, Compileroptionen usw. usf. unterscheiden. Hab ich 
schon gesehen sowas...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jasch schrieb:
>>  0.
>>  Es sei denn, du arbeitest mit 256-bit uC.
>
> Unwahrscheinlich, 256 Bits oder nicht.

 War ja auch nicht ernst gemeint.
 Aber ein guter Compiler sollte sich schon darüber beschweren, vor
 allem da es definiert ist, dass nach so einer Operation das resultat
 undefiniert ist...

 EDIT:
 Oops, keine Konstante, sondern Ergebnis, sorry.

: Bearbeitet durch User
von Hans (Gast)


Lesenswert?

1
unsigned char p[] =
2
    { 0, 4, 5, 8 };   //
3
    unsigned int n, k;
4
5
    // make exclusive-or pattern from polynomial
6
    poly = 0;
7
    for ( n = 0; n < sizeof( p ) / sizeof(unsigned char) ; n++ )
8
        poly |= 1 << ( 7 - p[n] );

Den Inhalt des Array habe ich auch mit anderen crc8 mit Polynom 0x8c 
verglichen.
Die Arrays waren gleich. Deswegen gehe ich davon aus dass zumindest 
dieser Teil richtig funktioniert.

Ich verstehe nur nicht wieso ich für 0xff die checksumme oxff bekomme.

von Hans (Gast)


Lesenswert?

PS:
Wer sich über die Definition unterhalten will soll bitte einen anderen 
Thread öffnen.

Ich hab den Code geändert und poly = 0x8c gesetzt.

von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:
>
1
unsigned char p[] =
2
>     { 0, 4, 5, 8 };   //
3
>     unsigned int n, k;
4
> 
5
>     // make exclusive-or pattern from polynomial
6
>     poly = 0;
7
>     for ( n = 0; n < sizeof( p ) / sizeof(unsigned char) ; n++ )
8
>         poly |= 1 << ( 7 - p[n] );
>
> Den Inhalt des Array habe ich auch mit anderen crc8 mit Polynom 0x8c
> verglichen.
> Die Arrays waren gleich. Deswegen gehe ich davon aus dass zumindest
> dieser Teil richtig funktioniert.


Das ändert nichts daran, dass 7 minus 8 zu einem Ergebnis von -1 führt 
und ein -1 in einer << Operation zu einem undefiniertem Eregbnis führt. 
Sorry, aber darüber brauchen wir wirklich nicht diskutieren.

Was hast du denn als Vorbild genommen? (Link)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:
> PS:
> Wer sich über die Definition unterhalten will soll bitte einen anderen
> Thread öffnen.

Ich glaub, dir ist die Bedeutung von 'undefiniertem Verhalten' nicht 
klar!
undefiniertes Verhalten bedeutet schlicht und ergreifend, dass es kein 
gesichertes Ergebnis gibt. Jedes Ergebnis ist aus Sicht des Compilers 
richtig. Daher brauchst du dich nicht zu wundern, dass du 'es einfach 
nicht verstehst'. Dein Code könnte genausogut würfeln und das Ergebnis 
wäre als richtig anzusehen.
Dieses undefinierte Verhalten muss erst mal aus deinem Code raus. Vorher 
ist es müssig, sich über irgendwelche Ergebnisse und wie sie zustande 
kommen zu unterhalten.

: Bearbeitet durch User
von Hans (Gast)


Lesenswert?

Was beim undefinierten verhalten alles passieren kann ist mit klar!

Nichts destotrotz.
Ich hab diese Schleife aus dem Code gelöscht!!! Und poly = 0x8c gesetzt.
Also ist da kein undefiniertes verhalten mehr!

Trotzdem hab ich für 0xff ein crc von 0xff.
Denn link selbst hab ich nicht mehr.

Habe aber die erstelle Tabelle unter anderem mit dem hier abgeglichen.

http://www.bidib.org/support/crc_code.html

Sie sind gleich!
Ich gehe davon aus dass ich hier ein Fehler hab.
1
uint8_t crc_8( uint8_t crc, void *buffer, uint8_t len )
2
{
3
    unsigned char *buf = (uint8_t *) buffer;
4
    crc = crc ^ 0xff;
5
6
//    uint8_t x = ( crc ^ ( *buf++ ) ) & 0xff;
7
//    uint8_t z = (x ^ ( crc >> 8 ));
8
9
10
    if ( len )
11
        do
12
        {
13
            crc = _crcTable[( crc ^ ( *buf++ ) ) & 0xff] ^ ( crc >> 8 );
14
        } while ( --len );
15
16
    return crc ^ 0xFF;
17
}

von Stefan E. (sternst)


Lesenswert?

1
 crc = _crcTable[( crc ^ ( *buf++ ) ) & 0xff] ^ ( crc >> 8 );
"^ ( crc >> 8 )"ist ein NOP. Was war der ursprüngliche Gedanke dahinter?

1
    unsigned char *buf = (uint8_t *) buffer;
Warum einmal unsigned char und einmal uint8_t?

1
    if ( len )
2
        do
3
        {
4
        ...
5
        } while ( --len );
Interessante Konstruktion.
War dir ein "while (len--) {}" zu langweilig?

Aber das sind alles Nebensächlichkeiten.
Dein eigentliches Problem dürfte hier liegen:
> Wenn ich von einem 0xff die crc Summe berechne bekomme ich 0xff.
> Das kann noch nicht sein...
Wieso kann das nicht sein? Was ist dein Problem damit?

von Hans (Gast)


Lesenswert?

Nun ja ich hab meinen Code mit dem Ergebnis hier kontrollieren wollen.

http://www.zorc.breitbandkatze.de/crc.html
CRC order  8
CRC polynom 8c
Initial value 0 oder ff hab beide probiert.
Final XOR value ff

reverse data bytes  AN & AUS gemacht
reverse CRC result before Final XOR

Data sequence 0xff

Ich komme einfach nicht auf 0xff als crc für 0xff.

Aber vielleicht sollte ich mich dem Thema noch mal widmen wenn die 
Erkältung überstanden ist...

von Felix P. (fixxl)


Lesenswert?

Wie hast du die Data Sequence eingegeben? Wenn du dez 255, also ff als 
ein Datenbyte als Eingabewert willst, musst du %ff eingeben. Bei 0xff 
schiebt er die vier Chars '0', 'x', 'f', 'f' durch und es ergibt sich 
ein anderes Ergebnis bei Groß- und Kleinschreibung.

Einstellungen für die Dallas/Maxim-CRC8 (x^8+x^5+x^4+1) sind:

CRC order: 8
CRC polynom: 31
Initial value: 0
Final XOR value: 0

Reverse data bytes und reverse CRC result before Final XOR sind beide 
angeklickt.

von Rolf M. (rmagnus)


Lesenswert?

Hans schrieb:
> Ich hab diese Schleife aus dem Code gelöscht!!!

BRÜLL NICHT SO RUM!!! Außerdem hättest du das ja gleich sagen können. Du 
hattest ja nur erwähnt, daß du "den Code geändert" hättest. Was du 
geändert hast, kann ja keiner riechen.

>             crc = _crcTable[( crc ^ ( *buf++ ) ) & 0xff] ^ ( crc >> 8 );

crc >> 8 ist immer 0, da crc nur 8 Bit breit ist.

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.