Laden...

C# Umsetzung von C++ Code: Pointer "data" durch ein char array[] ersetzt, aber wie?

Erstellt von Sakulrelda vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.505 Views
S
Sakulrelda Themenstarter:in
13 Beiträge seit 2014
vor 10 Jahren
C# Umsetzung von C++ Code: Pointer "data" durch ein char array[] ersetzt, aber wie?

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

R
212 Beiträge seit 2012
vor 10 Jahren

Du kannst Ein IntPtr als Pointer in C# nehmen, musst aber den code als unsave markieren.

unsafe (C#-Referenz)

den rest kannst du eig genauso übernehmen.

C
2.121 Beiträge seit 2010
vor 10 Jahren

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.

R
212 Beiträge seit 2012
vor 10 Jahren

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"

M
171 Beiträge seit 2012
vor 10 Jahren

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.

1.361 Beiträge seit 2007
vor 10 Jahren

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

1.361 Beiträge seit 2007
vor 10 Jahren

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