C CRC Berechnung - C code in C# übersetzen

djfresh69

Cadet 1st Year
Dabei seit
Okt. 2010
Beiträge
9
Hallo,

stehe da vor einem kniffligen Problem;-)
kann jemand folgenden Code von C in C# übersetzen?
Code:
static short Crc16Table[256];
void InitCrc16()
{
short i, j, crc;
for(i=0; i < 256; i++)
{
crc = (i << 8); /* Put i into MSB */
for(j=0; j < 8; j++) /* Do 8 reductions */
{
crc = (crc << 1) ^((crc & 0x8000)? 0x1021:0);
}
Crc16Table[i] = crc & 0xFFFF;
}
}
//------------------------------------------------
unsigned short Crc16(unsigned char *addr, int len)
{
unsigned short crc = 0;
int i;
for (i = 0; i < len; i++, addr++)
{
crc = Crc16Table[((crc >> 8) & 255)] ^ (crc << 8) ^
(*addr & 0xFF);
crc &= 0xFFFF;
}
return crc;
}
 

djfresh69

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
9
...fast
also bei der ersten methode habe ich mit folgender zeile probleme...

Code:
crc = (crc << 1) ^((crc & 0x8000)? 0x1021:0);
Ergänzung ()

also die erste Methode habe ich folgendermassen übersetzt:

Code:
        static uint[] Crc16Table = new uint[256];
        public void InitCrc16()
        {
            uint i, j, crc;
            for (i=0; i<256; i++)
            {
                crc = (i << 8);
                for (j = 0; j < 8; j++)
                {
                    if(crc & 0x8000)
                    {
                        crc= (crc<<1) ^ 0x1021;
                    }
                    else
                    {
                        crc = (crc << 1) ^ 0;
                    }
                }
            }
        }
Bekomme aber noch folgende Fehlermeldung bei:
crc & 0x8000
=>Eine implizite Konvertierung vom Typ "uint" in "bool" ist nicht möglich.
 

kuddlmuddl

Commander
Dabei seit
Mai 2010
Beiträge
2.495
Naja in C gibt es kein bool sondern das wird über == 0 für false und != 0 für true geregelt
Dh if (crc & 0x8000) wäre dann if ( (crc & 0x8000) != 0)
 

djfresh69

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
9
ok Danke,
kann es sein dass
unsigned char *addr dasselbe ist wie
byte *addr ?
 

IceMatrix

Lt. Commander
Dabei seit
Jan. 2008
Beiträge
1.535
byte ist in c kein offizieller typ, wird aber häufig als typedef unsigned char definiert.
 
1

1668mib

Gast
Die Zeile "Crc16Table = crc & 0xFFFF;" fehlt noch, außerdem würde ich die 256 durch Crc16Table.Length ersetzen.

Edit:
Code:
static short Crc16Table[256];
void InitCrc16()
{
  short i, j, crc;
  for(i=0; i < Crc16Table.Length; i++)
  {
    crc = (i << 8); /* Put i into MSB */
    for(j=0; j < 8; j++) /* Do 8 reductions */
    {
      crc = (crc << 1) ^ (((crc & 0x8000) != 0) ? 0x1021:0);
    }
    Crc16Table[i] = crc & 0xFFFF;
  } 
}
//------------------------------------------------
unsigned short Crc16(char[] data)
{
  unsigned short crc = 0;
  int i;
  for (i = 0; i < data.Length; i++)
  {
    crc = Crc16Table[((crc >> 8) & 255)] ^ (crc << 8) ^ (data[i] & 0xFF);
    crc &= 0xFFFF;
  }
  return crc;
}
Keine Ahnung ob es läuft, über den datentyp kann man diskutieren...
 
Zuletzt bearbeitet:
1

1668mib

Gast
Ja, im C99-Standard gibts nen bool... aber nicht bei jedem Compiler ist der Modus standardmäßig aktiv.
 

IceMatrix

Lt. Commander
Dabei seit
Jan. 2008
Beiträge
1.535
Die Semantik von if-Anweisungen ist in C eine andere als in C#. So wird bei C# in der Bedingung ausdrücklich ein bool verlangt wohingegen C nur einen skalaren Typen verlangt, der automatisch auf != 0 geprüft wird.

Wenn du mit gcc arbeitest, dann häng einfach ein -std=c99 als Argument beim Kompilieren an, dann hast du C99 Standard. Bei Visual Studio ist es soweit ich weiss immer C90 wenn du den Compiler auf C (only) stellst. Da kompilierst du am besten als C++.
 

djfresh69

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
9
ja ist schon ne kleine Umstellung von C# auf C,
weiss jemand wie man:
INT8U* pDst,const INT8U* pSrc,INT32U nSrcLen
am besten in C# übersetzt?
 

djfresh69

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
9
Weil ich dann einen anderen CRC rausbekomme, es geht halt darum auch die richtige CrcTabelle zu generieren.

Der obige Code in C stammt von Tim Kientzle (1997 - A programmer's guide to sound)...

Aber ich brauch den halt in C# und find den nirgends...
C is für mich wie französisch... ich versteh nur einen teil...
 

leimer

Cadet 2nd Year
Dabei seit
Jan. 2006
Beiträge
28
So wie ich das sehe, ist der "Startwert" (Polynom) bei dir 0x1021. Dann initialisierst du eben einfach die Klasse CRC16 von Tamir Khason mit
Code:
CRC16 crc = new CRC16(0x1021);
und schon kriegst du denselben Wert (bzw. den invertierten, also XOR 0xFFFF).
 

djfresh69

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
9
also ich habe es folgendermassen übersetzt:
Code:
        static uint[] Crc16Table = new uint[256];
        public void InitCrc16()
        {
            uint i, j, crc;
            for (i=0; i<256; i++)
            {
                crc = (i << 8);
                for (j = 0; j < 8; j++)
                {
                    if((crc & 0x8000) != 0)
                    {
                        crc= (crc<<1) ^ 0x1021;
                    }
                    else
                    {
                        crc = (crc << 1) ^ 0;
                    }
                }
                Crc16Table[i] = crc & 0xFFFF;
            }            
        }

        public uint Crc16C(byte[] addr, int len)
        {
            uint crc = 0;
            int j, i;

            for (i=0,j=0; i<len;i++,j++)
            {
                crc = Crc16Table[((crc >> 8) & 255)] ^ (crc << 8) ^ ((uint)addr[j] & 0xFF);
                crc &= 0xFFFF;
            }
            return crc;
        }
...Danke für die Tipps...
 
Top