Ich suche eine Funktion, mit welcher ich die CRC32 Prüfsumme berechnen kann.
Ich habe zwar schon diverse Algorithmen gefunden, jedoch keinen, welcher es mir ermöglicht den Pfad der Datei anzugeben und ich bekomme die CRC32 als Returnwert.
Die Funktion in Wikipedia kapiere ich nicht bzw. ich weiß nicht, wie ich es umbauen kann, damit ich eine ganze beliebig große Datei damit verwenden kann:
#include <stdio.h> #define CRC32POLY 0x04C11DB7 /* CRC-32 Polynom */ int datastream[]={1,0,0,0,1,1,0,0}; int databits=8; unsigned long crc32; /* Shiftregister */ void calc_crc32(int bit) { int hbit=(crc32 & 0x80000000) ? 1 : 0; if (hbit != bit) crc32=(crc32<<1) ^ CRC32POLY; else crc32=crc32<<1; crc32 &= 0xffffffff; /* begrenze auf 32 Bits */ } int main() { int i; crc32=0xffffffff; /* Startwert (111... bei CRC-32) */ for (i=0; i<databits; ++i) calc_crc32(datastream[i]); printf("0x%08X",crc32 ^ 0xffffffff); /* invertiere Ergebnis */ }
Ein anderes Skript habe ich auch noch gefunden und auch getestet, jedoch gibt es mir immer eine falsche Prüfsumme aus und es ist mehr als kompliziert:
// SFV_Check.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" typedef unsigned long u32; #define MANUFACTURING_INFO_SIZE 140 //komplettes Feld incl. chksum #define CRC32_POLYNOMIAL 0xEDB88320 char Manufactureing_Info [MANUFACTURING_INFO_SIZE]; u32 util_gen_crc (char *pcDatabuf, u32 ulDatalen, u32 ulCrc_in); int _tmain(int argc, _TCHAR* argv[]){ FILE *werte; char Infos_ohne_Mac [MANUFACTURING_INFO_SIZE]; //### warum als "r" und nicht als "rb"? if ( (werte = fopen("c:\\test.txt","rb"))==NULL) //Pointer auf Datei wird in werte gespeichert { printf("error opening file"); exit(0); } else { #if 1 fseek(werte, 116, SEEK_SET);//überspringen von 116 bytes fread(Infos_ohne_Mac, 1, MANUFACTURING_INFO_SIZE, werte);//einlesen von MANUFACTURING_INFO_SIZE bytes #else for (int i=1; i<=116; i++) { //überlesen der ersten 116 Zeichen, dürfen nicht in Berechnung eingehen getc(werte); } (int i=0; i<MANUFACTURING_INFO_SIZE; i++) { Infos_ohne_Mac [i] = getc(werte); //Einlesen und speichern in Infos_ohne_Mac der relevanten Daten für Berechnung } #endif } //verlassen if-Schleife fclose(werte); //Datei schließen u32 chksum; chksum = ~ util_gen_crc (Infos_ohne_Mac, MANUFACTURING_INFO_SIZE -4, 0xffffffff); //checksumme berechnen /*der errechnete crc wert wird in die letzten 4 bytes des char arrays gespeichert (chksum):*/ *((u32 *)&Infos_ohne_Mac [MANUFACTURING_INFO_SIZE -4]) = chksum; printf("Die checksumme ist: %08lx",chksum); //Test!!(wird später entfernt) } /* ***************************** ende main ************************************************** ***************** */ //Funktion, die CRC 32 Wert berechnet. Ist vorgegeben, darf nicht verändert werden! u32 util_gen_crc (char *pcDatabuf, u32 ulDatalen, u32 ulCrc_in) { u32 idx, bit, data, crc; crc = ulCrc_in; for (idx = 0; idx < ulDatalen; idx++) { data = *pcDatabuf++; for (bit = 0; bit < 8; bit++, data >>=1) { crc = (crc >> 1) ^ (((crc ^ data) & 1) ? CRC32_POLYNOMIAL : 0); } } return crc; }
Kann mir bitte jemand helfen - ich blicke nicht mehr durch, wie ich es anstellen soll, die CRC32 Checksum zu berechnen...
Danke
mfg
gorko