Code, was macht dieser?



  • Hallo Community,

    ich bin eigentlich Java und C# Entwickler und möchte nun folgenden C++
    Code in C# übertragen.

    Da es in C# direkt die funktion eines dementsprechenden Pointers nicht gibt,
    ist die Frage wie ich das ansonsten lösen kann... in Wirklichkeit wird als
    Übergabeparameter ein Array vom Typ char übergeben.

    Jetzt die Frage an die ganzen C++ Cracks hier,
    was genau macht dieser Code und wie kann man diesen umsetzen?

    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);
    }
    


  • data ist ein Array und len ist die Laenge des Arrays. data zeigt dazu auch noch auf die aktuelle Position (was normal dein i macht), mit *data liest man den Wert an der Position und mit data++ inkrementiert man den Index (also quasi i++).

    unsigned short CalculateCrc(char data[])
    {
        unsigned int i;
        unsigned short crc = 0;
    
        for(int x = 0; x < data.Length(); x++)
        {
            i = (crc >> 12) ^ (data[x] >> 4);
            crc = crc_table[i & 0x0F] ^ (crc << 4);
            i = (crc >> 12) ^ (data[x] >> 0);
            crc = crc_table[i & 0x0F] ^ (crc << 4);
        }
    
        return (crc & 0xFFFF);
    }
    

    Jetzt aber mal Butter bei die Fische: Was fuer ein Entwickler hat den so ueberhaupt keine Ahnung von Pointern?



  • Also damit nicht kommt, ich würde mir keine Gedanken machen 😉

    Ich vermute, dass ich irgendwie sowas in der Art machen muss oder ?

    static const short[16] crc_table = 
    {
        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
    };
    
    short CalculateCrc(char[] data, unsigned int arrayDataLen)
    {
        int i;
        short crc = 0;
    
        while(arrayDataLen>0)
        {
    
            //Pointer *data durch data[data.Length-arrayDataLen]
            //Jedoch ist mir nicht ganz klar was >>;^ usw macht und ob ich das überhautp in C# nutzen kann ?!
            i = (crc >> 12) ^ (*data >> 4);
            crc = crc_table[i & 0x0F] ^ (crc << 4);
            i = (crc >> 12) ^ (*data >> 0);
            crc = crc_table[i & 0x0F] ^ (crc << 4);
            arrayDataLen--;
        } 
    
        return (crc & 0xFFFF);
    }
    


  • , |, &, <<, ^ sind Operatoren, die Bits bearbeiten.
    Google mal: bitwise operators c++



  • ArneMax schrieb:

    data ist ein Array und len ist die Laenge des Arrays. data zeigt dazu auch noch auf die aktuelle Position (was normal dein i macht), mit *data liest man den Wert an der Position und mit data++ inkrementiert man den Index (also quasi i++).

    unsigned short CalculateCrc(char data[])
    {
        unsigned int i;
        unsigned short crc = 0;
       
        for(int x = 0; x < data.Length(); x++)
        {
            i = (crc >> 12) ^ (data[x] >> 4);
            crc = crc_table[i & 0x0F] ^ (crc << 4);
            i = (crc >> 12) ^ (data[x] >> 0);
            crc = crc_table[i & 0x0F] ^ (crc << 4);
        }
     
        return (crc & 0xFFFF);
    }
    

    Jetzt aber mal Butter bei die Fische: Was fuer ein Entwickler hat den so ueberhaupt keine Ahnung von Pointern?

    > Da warst du wohl mal wieder schnelle 😉
    --> Zu dem Thema Pointer kann ich nur sagen das ich es prinzipiell schon verstehe mich aber "faulerweise" nie richtig damit beschäftigt habe... Deshalb muss ich ja hier jetzt auch um Hilfe betteln 🙂 Vielen Dank aufjedenfall für die schnelle Hilfe und ich werde das ganze gleich mal versuchen umzusetzen!


Anmelden zum Antworten