CRC32 Vergleich



  • Was steht denn in beiden Fällen als Ausgabe da?
    Evt. könntest du mal einen unsigned int probieren, auch wenn es so eigentlich gehen sollte.



  • %X interpretiert ja auch anders als %d, ist normal ne. Ich vermute mal, deine Werte sind nicht gleich. Aber ohne Code bleibt es ein Rätselraten.



  • Bei der Ausgabe mit %x ist die Ausgabe: E7AB83B3
    Bei %d: -408190029

    unsigned int habe ich auch versucht. Geht aber auch nicht.

    Hier der Code.
    Ist aber nur die for-schleife, deswegen weiß ich nicht wieso es ein Rätselraten ohne Code ist.

    for(z=0; z<10;z++)
    		if(test[z]==crc32_rev)
    			printf("Gleichheit: %X=%X\n", test[z], crc32_rev);
        test[counter]=crc32_rev;
    

    diese for-schleife steht in einer Funktion, die von außerhalb immer wieder aufgerufen wird und u.a. den counter um 1 erhöht.
    Der Wert crc32_rev wird erst ins Array geschrieben, nachdem die Prüfung fertig ist, da es sonst kein Sinn macht, da sonst der selbe Wert 2mal nacheinander im Array vorhanden ist.

    Wenn ich mir jeweils die Werte test[z] und crc32_rev mittles %x ausgeben lassen, dann bekomme ich die gleiche Ausgabe.
    Aber bei if(test[z]==crc32_rev) wird ja anders geprüft, deswegen meine Frage wie man das anders machen kann.



  • sneeker schrieb:

    Bei der Ausgabe mit %x ist die Ausgabe: E7AB83B3
    Bei %d: -408190029

    Das sieht soweit noch nicht falsch aus - was wird für den anderen Wert ausgegeben?



  • Ausgabe: printf("%X", test[0]); -> E7AB83B3
    Ausgabe: printf("%X", crc32_rev); -> E7AB83B3

    Es hapert nur am direkten Vergleich, da anscheinend

    if(test[0]==crc32_rev)
    

    nicht stimmen kann/darf/soll, oder wie auch immer.



  • Also laut Rechnung bedeutet 0xE7AB83B3 im 32 Bit-Ganzzahlsystem: -408190029. Wie gesagt, stimmt das soweit - das sollte auch der Wert sein, der eigentlich für den Vergleich genutzt wird (du hast ja ein int-Array). Wenn du ohnehin die Hex-Werte vergleichen willst, kannst du ja mal einen binären Vergleichsoperator ausprobieren:

    if(!(test[i] ^ crc32_rev))
    {
    }
    

    Eventuell geht das. Aber eigentlich bin ich von deinem Problem momentan genauso fasziniert wie du, weil es eigentlich kein Problem geben dürfte. Allerdings kann ich mich damit rausreden, dass du eventuell zu wenige Informationen gibst ;).

    An welcher Stelle genau gibst du eigentlich deine Werte aus? Wird bis zum Vergleich auch sicher nichts mehr damit gemacht? Bzw. werden sie danach nochmal angefasst?



  • Ne, das wird danach nicht mehr verändert.
    Folgender Code:

    Aus Wiki:

    int i;
        for (i=0; i<databits; ++i)
        {
            if ((crc32_rev & 1) != dataTemp[i])
                 crc32_rev = (crc32_rev >> 1) ^ CRC32POLYREV;
            else
                 crc32_rev >>= 1;
        }
    

    mit dataTemp einem von mir erstelltes Array, in dem die Zahlen 0 und 1 nach einer zufälligen Reihenfolge enthalten sind, die bei jedem Funktionsaufruf geändert wird.

    Vergleich: (direkt unter obigem Code)

    for(z=0; z<100;z++)
    		{
    			if(test[z]==crc32_rev)
    			{
    				printf("Gleichheit: %X=%X\n", test[z], crc32_rev);
    			}
    		}
    

    Und unter diesem Code:

    test[counter]=crc32_rev;
    

    Hier hört die Funktion auf.

    Kann ich diesen Wert crc32_rev überhaupt in ein int Array schreiben?



  • Guter Gedanke, versuch doch zum Test mal, den Inhalt des Schieberegisters zu addieren, anstatt ihn zuzuweisen:

    test[i] = 0;
    test[i] &= crc32_rev;
    //...
    if(test[i] == (0 & crc32_rev))
    {//...
    }
    

    Vielleicht hilft's ja. Wenn nicht, musst du wohl bis morgen warten, irgendjemand wird schon Rat wissen. Ich geh schlafen.



  • Was ist bei dir crc32_rev für ein Datentyp?



  • Laut Wikipedia wäre es ein uint32_t - und daran hat er sich ja angeblich gehalten.



  • Ähm..ja, wie in Wiki.

    Aber das Thema hat sich erledigt. Ein dickes sorry für eure Bemühungen. Da hat sich

    printf("\033c");
    	fflush(stdout);
    

    im Code versteckt.
    Deswegen hatte ich keine Ausgabe bekommen.
    OMG.......sorry nochmal.


Anmelden zum Antworten