Hallo Community,
ich habe das Problem, dass ich einen C++ Code habe und leider nicht weiß, wie ich diesen in C# Code convertiere...
Das Problem ist, dass ich einen Pointer besitze der hochgezählt wird, also mit jedem hochzählen der Pointer in ein neuen char springt und damit weiter gerechnet wird!
Hier habt ihr mal den C++ Code, der Pointer "data" muss durch ein char array[] ersetzt werden, aber wie !?
C++:
static const unsigned short crc_table[16] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};
unsigned short CalculateCrc(char *data, unsigned int len)
{
unsigned int i;
unsigned short crc = 0;
while(len--)
{
i = (crc >> 12) ^ (*data >> 4);
crc = crc_table[i & 0x0F] ^ (crc << 4);
i = (crc >> 12) ^ (*data >> 0);
crc = crc_table[i & 0x0F] ^ (crc << 4);
data++;
}
return (crc & 0xFFFF);
}
Danke schonmal für die super Hilfe 😃
Mit freundlichen Grüßen - best regards
Lukas Adler
Fachinformatiker für Anwendungsentwicklung
staatl. gepr. WIA
Du kannst Ein IntPtr als Pointer in C# nehmen, musst aber den code als unsave markieren.
den rest kannst du eig genauso übernehmen.
Da kannst du auch einfach einen String übergeben falls es wirklich mal einer war und dann auf den mit dem Index der chars zugreifen.
Oder ein char[] und darauf dann mit Index zugreifen. unsafe bräuchte man hier nicht unbedingt.
Nach genauerem anschauen des codes glaube ich nicht unbedingt das du weißt was da wirklich passiert.
mach aus "char *data", ein "out char[] data" oder "ref char[] data"
In C# entspricht das einem char[] oder einem string, sollte beides funktionieren. Da beides Referenztypen sind, brauchst Du auch kein ref oder out.
Das data++ kannst du z.B. mit einer foreach Schleife abbilden.
Jap, eine ganz normale for-Schleife tuts.
static ushort[] crc_table =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};
static ushort CalculateCrc(char[] data)
{
ushort crc = 0;
int i = 0;
for(int k=0; k<data.Length; k++)
{
i = (crc >> 12) ^ (data[k] >> 4);
crc = (ushort) (crc_table[i & 0x0F] ^ (crc << 4));
i = (crc >> 12) ^ (data[k] >> 0);
crc = (ushort) (crc_table[i & 0x0F] ^ (crc << 4));
}
return (ushort)(crc & 0xFFFF);
}
beste Grüße
zommi
Der Code berechnet übrigens CRC16 à la XMODEM mit dem Polynom 0x1021.
Falls du sicherstellen willst, das alles richtig funktioniert, oder nach einer anderen Implementierung Ausschau hälst.
Im Thread CRC-16 Prüfsumme gibts hunderte Einträge dazu 😃
Beste Grüße
zommi