Autor Beitrag
Tobiask
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 27.02.08 15:54 
Hallo,

ich habe zur Zeit einen CRC16 Algorithmus der wie folgt aussieht:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
//******************************************************************************
//* CrcByte (CRC berechnen)
//******************************************************************************
void CrcByte(unsigned char byte)
{
    // fast bit by bit algorithm without augmented zero bytes.
    // does not use lookup table, suited for polynom orders between 1...32.

    unsigned int c, j, bit;

    c = (unsigned int) byte;
    for (j = 0x0001; j < 0x0100; j <<= 1) {
        bit = Crc & 0x8000;
        Crc <<= 1;
        if (c & j)
            bit ^= 0x8000;
        if (bit)
            Crc ^= CRCPOLY;
    }
}


diesen möchte ich gerne in C# haben, das habe ich jetzt so umgesetzt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 void CrcByte( byte b )
        {
            // fast bit by bit algorithm without augmented zero bytes.
            // does not use lookup table, suited for polynom orders between 1...32.

            ushort c, j, bit;
            c = (ushort)b;

            for( j = 0x0001; j < 0x0100; j <<= 1 )
            {
                bit = (ushort)( Crc & 0x8000 );
                Crc <<= 1;
                bool bcj = Convert.ToBoolean( ( c & j ) );
                if( bcj )
                    bit ^= 0x8000;
                bool bbit = Convert.ToBoolean( bit );
                if( bbit )
                    Crc ^= CRCPOLY;
            }
        }


Das Problem ist, der C# Algo gibt falsche Werte zurück... Kann jemand den Fehler finden, ich steh auf´m Schlauch ;)

Crc ist vom Typ ushort und global definiert, CRCPOLY ist ebenfalls ushort (const) und 0x1021

Gebe ich 0x01 ein müsste als Ergebnis 0x1189 herauskommen, tut es im C Programm auch, im C# Programm allerdings nicht... dort erhalte ich 0x9188


Moderiert von user profile iconChristian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am Mi 27.02.2008 um 14:59
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 27.02.08 19:33 
Ich sehe jedenfalls keinen Übersetzungsfehler. Wenn es anderen auch so geht, bleibt dir wohl nur eines übrig: Parallel debuggen und bei der ersten Abweichung von Hand nachrechnen ;) .

[add]
Wozu gebe ich mir überhaupt noch die Mühe...
[/add]
[add id="1"]
Ehm... talla hat nicht wirklich genau die gleiche Antwort gegeben, noch bevor dieser Thread hier überhaupt erst erstellt wurde? Ich kapituliere vor der Dreistigkeit.
[/add]
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 28.02.08 01:21 
unsigned int ist ein 32bit Integer, ushort aber nur 16bit.
Da das ein CRC16 sein soll vermute ich mal (Achtung gefährliches Halbwissen) das eher dein C Version falsch ist und nicht die in C#.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 28.02.08 01:34 
@Khabarakh: Dann verlinke doch zumindest auf den Thread, wenn Du schon moserst :roll:
www.mycsharp.de/wbb2...d.php?threadid=51773

@Tobiask: Wenn Du in zwei Foren fragst, dann verlinke bitte auf den jeweils anderen Thread, damit nicht jemand eine Antwort schreibt, die woanders schon gegeben wurde. :mahn:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 28.02.08 13:14 
user profile iconRalf Jansen hat folgendes geschrieben:
unsigned int ist ein 32bit Integer, [...]
Eben nicht: www.mycsharp.de/wbb2...id=279080#post279080 .
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 28.02.08 13:49 
user profile iconKhabarakh hat folgendes geschrieben:
user profile iconRalf Jansen hat folgendes geschrieben:
unsigned int ist ein 32bit Integer, [...]
Eben nicht: www.mycsharp.de/wbb2...id=279080#post279080 .


Jein ;)

Auf seinem Microcontroller mag das Stimmen das dessen Registerbreite 16bit ist und damit eben unsigned int 16bittig ist.
Aber den CRC Wert den er für seine C Version angibt erhält man nur wenn das ein 32bit Datentyp ist, ergo
muß unsigned int auf dem System auf dem er das ausprobiert hat auch 32bittig sein(darum auch meine Anmerkung ob nicht eher die C Version falsch ist und nicht die in C#)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 28.02.08 18:42 
Achso, du hast es mit 32 Bit ausprobiert - und da hast du Recht, das ergibt dann wirklich 0x9188.