Prüfsumme (CRC-32) von einem zweidimensionalem Array erzeugen



  • Moin moin,

    ich würde gerne die Prüfsumme für ein zweidimensionales Array erzeugen und ihn wieder korrekt auslesen können.
    Dazu habe ich mir einmal den Wiki Artikel http://de.wikipedia.org/wiki/Zyklische_Redundanzprüfung durchgelesen und folgenden Code gefunden:

    #include <stdio.h>
    #include <stdlib.h>
    #include <inttypes.h>
    #define CRC32POLY 0x04C11DB7 /* CRC-32 Polynom */
    
    int datastream[] = {1,0,0,0,1,1,0,0};
    int databits = 8;
    uint32_t crc32 = 0; /* Schieberegister */
    /*__int32 crc32 = 0; => für MS VS */
    
    int main(void)
    {
        int i;
        for (i = 0; i < databits; ++i)
            if (((crc32 & 0x80000000) ? 1 : 0) != datastream[i])
                 crc32 = (crc32 << 1) ^ CRC32POLY;
            else
                 crc32 <<= 1;
        printf("0x%08X\n", crc32);
        return EXIT_SUCCESS;
    }
    

    ich verstehe den code weitestgehend, aber ich wüsste nun nicht, wie ich ihn auf ein 2d-array anpassen sollte.
    man könnte ja einfach eine zweite schleife einbauen um zeilen UND spalten abzufangen. würde das funktionieren oder gibt es dort bedenken?


  • Mod

    Ein 2D-Array ist auch nur ein zusammenhängender (1D-)Datenstrom, für den es eben noch eine andere Interpretation gibt.



  • so würde ich es nun machen.

    void checksum(int array[][]) {
        int i,j;
        for (i = 0; i < sizeof(feld); ++i)
         for (j = 0; j < sizeof(feld); ++j)
            if (((crc32 & 0x80000000) ? 1 : 0) != array[i][j])
                 crc32 = (crc32 << 1) ^ CRC32POLY;
            else
                 crc32 <<= 1;
        printf("0x%08X\n", crc32);
        return EXIT_SUCCESS;  
    }
    

    mein problem ist aber uach zusätzlich, welches ich leider vergessen habe zu erwähnen, dass das komplette array in einer variable gespeichert weden soll, so dass ich es danach aus dieser variable wieder auslesen kann.
    mit diesem code schreibe ich ja nur jeden wer einzelnt in eine variable.

    könnte man es so machen, dass ich nacheinander der variable crc32 das array hinten dran füge? oder gibt dass dann fehler in der speicherung?



  • Ich habe deine letzten Sätze nicht verstanden.
    Dein abkopierter Code auch laienhaft, globale Variablen, Verzicht auf sizeof und verständnislose C99 Verwendung ohne Initial-Definition der Laufvariable i.
    Deine Variante, das Problem in eine eigene Funktion zu kapseln ist richtig, die Umsetzung ist aber schlecht ( was ist feld, [][] dürfte uncompilierbar sein, EXIT_SUCCESS gehört nur in den main-Kontext, ... ).
    Besser du übergibst der Funktion einen Zeiger auf den Beginn deines Speichers und die Anzahl der (int)Elemente, also in etwa

    uint32_t checksum(const int *array,int n) {
        uint32_t crc32 = 0;
        for (int i = 0; i < n; ++i)
            if (((crc32 & 0x80000000) ? 1 : 0) != array[i])
                 crc32 = (crc32 << 1) ^ CRC32POLY;
            else
                 crc32 <<= 1;
        //printf("0x%08X\n", crc32);
        return crc32;  
    }
    

    Eine evtl. Compilerwarnung, wenn du ein int array[X][Y] an die Funktion übergibst, kannst du ignorieren.


Anmelden zum Antworten