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;
}
 
...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.
 
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)
 
ok Danke,
kann es sein dass
unsigned char *addr dasselbe ist wie
byte *addr ?
 
byte ist in c kein offizieller typ, wird aber häufig als typedef unsigned char definiert.
 
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:
Ja, im C99-Standard gibts nen bool... aber nicht bei jedem Compiler ist der Modus standardmäßig aktiv.
 
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++.
 
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?
 
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...
 
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...
 
Zurück
Top