CRC 32
-
Nee, ich weiss nicht wie es projectx macht. ich habe auch einige internet quellen gefunden, da habe ich das gleiche bekommen wie der code von wiki.. Aber projectx muss es eigentlich machen
-
Oh, ProjectX ist ein Video-Konverteierer. Es scheint um CRC in MPEG zu gehen.
-
Kann gut sein, dass "projectx" da etwas anders macht. Es gibt zig "Variationen", wenn man nur das Generator-Polynom G(x) festlegt. Der Wikipedia-Code sieht aber i.O. aus -- also so, wie es sein soll / üblich ist.
Mögliche Variationen:
- Reihenfolge der Bits der Datenbytes
- Reihenfolge der Datenbytes
- Reihenfolge der Bits im Schieberegister
- Initialwert des Registers
- Wird "M(x) mod G(x)" oder "(M(x) * x^32) mod G(x)" als "Divisionsrest" benutzt?
- "Final XOR""projectx" sagt mir aber jetzt nichts.
Gruß,
SP
-
Schätze, das ist es: http://www.supersoftcafe.com/2009/09/16/crc32-on-mpeg2-section-data
-
Der "supersoftcafe.com"-Code, ist mit dem von Wikipedia kompatibel, wenn man die Bits der Datenbytes in Reihenfolge MSB nach LSB behandelt und das Register mit 0xFFFFFFFF statt 0 initialisiert.
-
ProjectX verwendet Rocksoft CRC32 kann mir vielleicht jemand sagen wo ich das finde oder wie mein Code umändere
-
The Rocksoft parameters for CRC-32/MPEG-2 are (from Greg's catalogue):
Code:
Name : "CRC-32/MPEG-2"
Width : 32
Poly : 04C11DB7
Init : FFFFFFFF
RefIn : False
RefOut : False
XorOut : 00000000
Check : 0376E6E7
das sind die Parameter aber ich weiss nicht wo ich diese eingeben muss
-
crc32.h:
unsigned long crc32(unsigned long crc,const unsigned char* buf,unsigned len);
crc32.cpp:
static const unsigned long crc_table[256]={ 0x00000000UL,0x77073096UL,0xee0e612cUL,0x990951baUL,0x076dc419UL, 0x706af48fUL,0xe963a535UL,0x9e6495a3UL,0x0edb8832UL,0x79dcb8a4UL, 0xe0d5e91eUL,0x97d2d988UL,0x09b64c2bUL,0x7eb17cbdUL,0xe7b82d07UL, 0x90bf1d91UL,0x1db71064UL,0x6ab020f2UL,0xf3b97148UL,0x84be41deUL, 0x1adad47dUL,0x6ddde4ebUL,0xf4d4b551UL,0x83d385c7UL,0x136c9856UL, 0x646ba8c0UL,0xfd62f97aUL,0x8a65c9ecUL,0x14015c4fUL,0x63066cd9UL, 0xfa0f3d63UL,0x8d080df5UL,0x3b6e20c8UL,0x4c69105eUL,0xd56041e4UL, 0xa2677172UL,0x3c03e4d1UL,0x4b04d447UL,0xd20d85fdUL,0xa50ab56bUL, 0x35b5a8faUL,0x42b2986cUL,0xdbbbc9d6UL,0xacbcf940UL,0x32d86ce3UL, 0x45df5c75UL,0xdcd60dcfUL,0xabd13d59UL,0x26d930acUL,0x51de003aUL, 0xc8d75180UL,0xbfd06116UL,0x21b4f4b5UL,0x56b3c423UL,0xcfba9599UL, 0xb8bda50fUL,0x2802b89eUL,0x5f058808UL,0xc60cd9b2UL,0xb10be924UL, 0x2f6f7c87UL,0x58684c11UL,0xc1611dabUL,0xb6662d3dUL,0x76dc4190UL, 0x01db7106UL,0x98d220bcUL,0xefd5102aUL,0x71b18589UL,0x06b6b51fUL, 0x9fbfe4a5UL,0xe8b8d433UL,0x7807c9a2UL,0x0f00f934UL,0x9609a88eUL, 0xe10e9818UL,0x7f6a0dbbUL,0x086d3d2dUL,0x91646c97UL,0xe6635c01UL, 0x6b6b51f4UL,0x1c6c6162UL,0x856530d8UL,0xf262004eUL,0x6c0695edUL, 0x1b01a57bUL,0x8208f4c1UL,0xf50fc457UL,0x65b0d9c6UL,0x12b7e950UL, 0x8bbeb8eaUL,0xfcb9887cUL,0x62dd1ddfUL,0x15da2d49UL,0x8cd37cf3UL, 0xfbd44c65UL,0x4db26158UL,0x3ab551ceUL,0xa3bc0074UL,0xd4bb30e2UL, 0x4adfa541UL,0x3dd895d7UL,0xa4d1c46dUL,0xd3d6f4fbUL,0x4369e96aUL, 0x346ed9fcUL,0xad678846UL,0xda60b8d0UL,0x44042d73UL,0x33031de5UL, 0xaa0a4c5fUL,0xdd0d7cc9UL,0x5005713cUL,0x270241aaUL,0xbe0b1010UL, 0xc90c2086UL,0x5768b525UL,0x206f85b3UL,0xb966d409UL,0xce61e49fUL, 0x5edef90eUL,0x29d9c998UL,0xb0d09822UL,0xc7d7a8b4UL,0x59b33d17UL, 0x2eb40d81UL,0xb7bd5c3bUL,0xc0ba6cadUL,0xedb88320UL,0x9abfb3b6UL, 0x03b6e20cUL,0x74b1d29aUL,0xead54739UL,0x9dd277afUL,0x04db2615UL, 0x73dc1683UL,0xe3630b12UL,0x94643b84UL,0x0d6d6a3eUL,0x7a6a5aa8UL, 0xe40ecf0bUL,0x9309ff9dUL,0x0a00ae27UL,0x7d079eb1UL,0xf00f9344UL, 0x8708a3d2UL,0x1e01f268UL,0x6906c2feUL,0xf762575dUL,0x806567cbUL, 0x196c3671UL,0x6e6b06e7UL,0xfed41b76UL,0x89d32be0UL,0x10da7a5aUL, 0x67dd4accUL,0xf9b9df6fUL,0x8ebeeff9UL,0x17b7be43UL,0x60b08ed5UL, 0xd6d6a3e8UL,0xa1d1937eUL,0x38d8c2c4UL,0x4fdff252UL,0xd1bb67f1UL, 0xa6bc5767UL,0x3fb506ddUL,0x48b2364bUL,0xd80d2bdaUL,0xaf0a1b4cUL, 0x36034af6UL,0x41047a60UL,0xdf60efc3UL,0xa867df55UL,0x316e8eefUL, 0x4669be79UL,0xcb61b38cUL,0xbc66831aUL,0x256fd2a0UL,0x5268e236UL, 0xcc0c7795UL,0xbb0b4703UL,0x220216b9UL,0x5505262fUL,0xc5ba3bbeUL, 0xb2bd0b28UL,0x2bb45a92UL,0x5cb36a04UL,0xc2d7ffa7UL,0xb5d0cf31UL, 0x2cd99e8bUL,0x5bdeae1dUL,0x9b64c2b0UL,0xec63f226UL,0x756aa39cUL, 0x026d930aUL,0x9c0906a9UL,0xeb0e363fUL,0x72076785UL,0x05005713UL, 0x95bf4a82UL,0xe2b87a14UL,0x7bb12baeUL,0x0cb61b38UL,0x92d28e9bUL, 0xe5d5be0dUL,0x7cdcefb7UL,0x0bdbdf21UL,0x86d3d2d4UL,0xf1d4e242UL, 0x68ddb3f8UL,0x1fda836eUL,0x81be16cdUL,0xf6b9265bUL,0x6fb077e1UL, 0x18b74777UL,0x88085ae6UL,0xff0f6a70UL,0x66063bcaUL,0x11010b5cUL, 0x8f659effUL,0xf862ae69UL,0x616bffd3UL,0x166ccf45UL,0xa00ae278UL, 0xd70dd2eeUL,0x4e048354UL,0x3903b3c2UL,0xa7672661UL,0xd06016f7UL, 0x4969474dUL,0x3e6e77dbUL,0xaed16a4aUL,0xd9d65adcUL,0x40df0b66UL, 0x37d83bf0UL,0xa9bcae53UL,0xdebb9ec5UL,0x47b2cf7fUL,0x30b5ffe9UL, 0xbdbdf21cUL,0xcabac28aUL,0x53b39330UL,0x24b4a3a6UL,0xbad03605UL, 0xcdd70693UL,0x54de5729UL,0x23d967bfUL,0xb3667a2eUL,0xc4614ab8UL, 0x5d681b02UL,0x2a6f2b94UL,0xb40bbe37UL,0xc30c8ea1UL,0x5a05df1bUL, 0x2d02ef8dUL}; #define DO1 crc=crc_table[((int)crc^(*buf++))&0xff]^(crc>>8) #define DO8 DO1;DO1;DO1;DO1;DO1;DO1;DO1;DO1 unsigned long crc32(unsigned long crc,const unsigned char* buf,unsigned len) { if (buf==NULL)return 0UL; crc=crc^0xffffffffUL; while (len>=8) { DO8; len-=8; } if (len) do { DO1; } while (--len); return crc^0xffffffffUL; }
Der Code basiert auf der Version aus der zlib, glaube ich. In diesem Fall stünde er unter der entsprechenden Lizenz.
-
Danke vielmal ich war schon verzweifelt eine frage noch das Parameter CRC welche wert muss denn dort stehen
-
borhany schrieb:
Danke vielmal ich war schon verzweifelt eine frage noch das Parameter CRC welche wert muss denn dort stehen
Im Normalfall 0.
Wenn der übergebene Buffer als Fortsetzung eines anderen zu betrachten ist, gibst du dort den vorherigen Hashwert an, z.B.byte data[2000]; uint crc=crc32(0,data,1000); crc=crc32(crc,data+1000,1000); //ist äquivalent zu: crc=crc32(0,data,2000);
-
danke erstmal,
ich habe das so gemacht wie du es beschrieben hast mit den folgenenden werte
0x0,0xb0,0x0d,0x59,0x81,0xeb,0x0,0x0,0x0,0x1,0xe0,0x42
länge ist 12 und crc 0
ich habe als ergebnis 0x472049d0
das ergebnis sollte aber 0x5e44059a sein was habe ich wohl falsch gemacht
-
sorry mein ergebnis ist 0x56090abf ich habe leider was falsches abgeschrieben aber trotzdem was mache ich fasch
-
Das ergebins habe ich vorher auch gehabt. Es muss an ROcksoft noch angepasst werden, wie weiss ich leider nicht
-
0x56090abf ist das richtige Ergebnis, da gibt es also nichts anzupassen.
Edit:
keine Ahnung, was du falsch machst, bitte poste in Zukunft Code.
So geht es jedenfalls richtig:unsigned char buf[12]={0x0,0xb0,0x0d,0x59,0x81,0xeb,0x0,0x0,0x0,0x1,0xe0,0x42}; cout << hex << crc32(0,buf,12) << endl;
-
danke dir erstmal,
ich möchte den crc32 für ein transport stream berechnen und dafür muss die die rocksoft crc32 mir sagt das leider nichts.
-
std::string value = input_stream.get(); std::cout << std::hex << crc32(0, value.c_str(), value.size());
sieht doch ganz brauchbar aus...