Cyclic Redundancy Check 32 (CRC32) C Code
Last post was 13 Jan 2009 at 10:55
crc32
, labwindows cvi
, cyclic redundancy check
, c code
Edinburgh, United Kingdom
-
I have code that can create a CRC32 checksum for a given section of an MPEG2 Transmission Stream packet, and also check the CRC32 checksum of a given section of an MPEG2 Transmission Stream Packet. The section of code that checks the CRC is working as expected - I have a valid MPEG2 TS Packet and have run it through the code yielding the expected result. The problem I have is that the section of code to re-create the CRC32 checksum yields the wrong answer. I have checked the code against various sources and it is correct as far as I can see - perhaps I'm not using it correctly? Anyone offer any assistance? The below code shows the CRC32 check and create code. The CRC_Calc function works as expected, but the CRC_Make function is giving me the incorrect CRC32 checksum for the given values. I am developing using LabWindows CVI, so the code is based around the use of panels and button callbacks, but is hopefully still readable - if not let me know. Note that the CRC32 checksum is not calculated using the whole MPEG2 TS but rather one section of the payload - this is highlighted in the code (stufftdt function on line beginning *array++ = 0x73;). The code that is calling these functions is below the CRC32 code. static ULONG crcTable[256]; // Lookup table array void CRC_Init(void) { ULONG crc, poly; int i, j; poly = (ULONG)0xEDB88320L; for (i = 0; i < 256; i++) { crc = i; for (j = 8; j > 0; j--) { if (crc & 1) { crc = (crc >> 1) ^ poly; } else { crc >>= 1; } } crcTable[i] = crc; } } DWORD CRC_Make(unsigned char *Memory, DWORD Length) { char msg[80]={0}; ULONG theCrc; theCrc = 0xffffffffL; while(Length--) { sprintf(msg,"Byte: 0x%02X",*Memory); printTexboxLine(msg); theCrc = (theCrc >> 8) ^ crcTable[(theCrc & 0xFF) ^ *Memory++];//((theCrc >> 8) & 0x00FFFFFFL) ^ crcTable[(theCrc ^* Memory++) & 0xFFL]; } return theCrc; } static const DWORD crc32tab[] = { (DWORD) 0x0L ,(DWORD) 0x04C11DB7L, (DWORD) 0x09823B6EL, (DWORD) 0x0D4326D9L, (DWORD) 0x130476DCL, (DWORD) 0x17C56B6BL ,(DWORD) 0x1A864DB2L, (DWORD) 0x1E475005L, (DWORD) 0x2608EDB8L, (DWORD) 0x22C9F00FL, (DWORD) 0x2F8AD6D6L ,(DWORD) 0x2B4BCB61L, (DWORD) 0x350C9B64L, (DWORD) 0x31CD86D3L, (DWORD) 0x3C8EA00AL, (DWORD) 0x384FBDBDL ,(DWORD) 0x4C11DB70L, (DWORD) 0x48D0C6C7L, (DWORD) 0x4593E01EL, (DWORD) 0x4152FDA9L, (DWORD) 0x5F15ADACL ,(DWORD) 0x5BD4B01BL, (DWORD) 0x569796C2L, (DWORD) 0x52568B75L, (DWORD) 0x6A1936C8L, (DWORD) 0x6ED82B7FL ,(DWORD) 0x639B0DA6L, (DWORD) 0x675A1011L, (DWORD) 0x791D4014L, (DWORD) 0x7DDC5DA3L, (DWORD) 0x709F7B7AL ,(DWORD) 0x745E66CDL, (DWORD) 0x9823B6E0L, (DWORD) 0x9CE2AB57L, (DWORD) 0x91A18D8EL, (DWORD) 0x95609039L ,(DWORD) 0x8B27C03CL, (DWORD) 0x8FE6DD8BL, (DWORD) 0x82A5FB52L, (DWORD) 0x8664E6E5L, (DWORD) 0xBE2B5B58L ,(DWORD) 0xBAEA46EFL, (DWORD) 0xB7A96036L, (DWORD) 0xB3687D81L, (DWORD) 0xAD2F2D84L, (DWORD) 0xA9EE3033L ,(DWORD) 0xA4AD16EAL, (DWORD) 0xA06C0B5DL, (DWORD) 0xD4326D90L, (DWORD) 0xD0F37027L, (DWORD) 0xDDB056FEL ,(DWORD) 0xD9714B49L, (DWORD) 0xC7361B4CL, (DWORD) 0xC3F706FBL, (DWORD) 0xCEB42022L, (DWORD) 0xCA753D95L ,(DWORD) 0xF23A8028L, (DWORD) 0xF6FB9D9FL, (DWORD) 0xFBB8BB46L, (DWORD) 0xFF79A6F1L, (DWORD) 0xE13EF6F4L ,(DWORD) 0xE5FFEB43L, (DWORD) 0xE8BCCD9AL, (DWORD) 0xEC7DD02DL, (DWORD) 0x34867077L, (DWORD) 0x30476DC0L ,(DWORD) 0x3D044B19L, (DWORD) 0x39C556AEL, (DWORD) 0x278206ABL, (DWORD) 0x23431B1CL, (DWORD) 0x2E003DC5L ,(DWORD) 0x2AC12072L, (DWORD) 0x128E9DCFL, (DWORD) 0x164F8078L, (DWORD) 0x1B0CA6A1L, (DWORD) 0x1FCDBB16L ,(DWORD) 0x018AEB13L, (DWORD) 0x054BF6A4L, (DWORD) 0x0808D07DL, (DWORD) 0x0CC9CDCAL, (DWORD) 0x7897AB07L ,(DWORD) 0x7C56B6B0L, (DWORD) 0x71159069L, (DWORD) 0x75D48DDEL, (DWORD) 0x6B93DDDBL, (DWORD) 0x6F52C06CL ,(DWORD) 0x6211E6B5L, (DWORD) 0x66D0FB02L, (DWORD) 0x5E9F46BFL, (DWORD) 0x5A5E5B08L, (DWORD) 0x571D7DD1L ,(DWORD) 0x53DC6066L, (DWORD) 0x4D9B3063L, (DWORD) 0x495A2DD4L, (DWORD) 0x44190B0DL, (DWORD) 0x40D816BAL ,(DWORD) 0xACA5C697L, (DWORD) 0xA864DB20L, (DWORD) 0xA527FDF9L, (DWORD) 0xA1E6E04EL, (DWORD) 0xBFA1B04BL ,(DWORD) 0xBB60ADFCL, (DWORD) 0xB6238B25L, (DWORD) 0xB2E29692L, (DWORD) 0x8AAD2B2FL, (DWORD) 0x8E6C3698L ,(DWORD) 0x832F1041L, (DWORD) 0x87EE0DF6L, (DWORD) 0x99A95DF3L, (DWORD) 0x9D684044L, (DWORD) 0x902B669DL ,(DWORD) 0x94EA7B2AL, (DWORD) 0xE0B41DE7L, (DWORD) 0xE4750050L, (DWORD) 0xE9362689L, (DWORD) 0xEDF73B3EL ,(DWORD) 0xF3B06B3BL, (DWORD) 0xF771768CL, (DWORD) 0xFA325055L, (DWORD) 0xFEF34DE2L, (DWORD) 0xC6BCF05FL ,(DWORD) 0xC27DEDE8L, (DWORD) 0xCF3ECB31L, (DWORD) 0xCBFFD686L, (DWORD) 0xD5B88683L, (DWORD) 0xD1799B34L ,(DWORD) 0xDC3ABDEDL, (DWORD) 0xD8FBA05AL, (DWORD) 0x690CE0EEL, (DWORD) 0x6DCDFD59L, (DWORD) 0x608EDB80L ,(DWORD) 0x644FC637L, (DWORD) 0x7A089632L, (DWORD) 0x7EC98B85L, (DWORD) 0x738AAD5CL, (DWORD) 0x774BB0EBL ,(DWORD) 0x4F040D56L, (DWORD) 0x4BC510E1L, (DWORD) 0x46863638L, (DWORD) 0x42472B8FL, (DWORD) 0x5C007B8AL ,(DWORD) 0x58C1663DL, (DWORD) 0x558240E4L, (DWORD) 0x51435D53L, (DWORD) 0x251D3B9EL, (DWORD) 0x21DC2629L ,(DWORD) 0x2C9F00F0L, (DWORD) 0x285E1D47L, (DWORD) 0x36194D42L, (DWORD) 0x32D850F5L, (DWORD) 0x3F9B762CL ,(DWORD) 0x3B5A6B9BL, (DWORD) 0x0315D626L, (DWORD) 0x07D4CB91L, (DWORD) 0x0A97ED48L, (DWORD) 0x0E56F0FFL ,(DWORD) 0x1011A0FAL, (DWORD) 0x14D0BD4DL, (DWORD) 0x19939B94L, (DWORD) 0x1D528623L, (DWORD) 0xF12F560EL ,(DWORD) 0xF5EE4BB9L, (DWORD) 0xF8AD6D60L, (DWORD) 0xFC6C70D7L, (DWORD) 0xE22B20D2L, (DWORD) 0xE6EA3D65L ,(DWORD) 0xEBA91BBCL, (DWORD) 0xEF68060BL, (DWORD) 0xD727BBB6L, (DWORD) 0xD3E6A601L, (DWORD) 0xDEA580D8L ,(DWORD) 0xDA649D6FL, (DWORD) 0xC423CD6AL, (DWORD) 0xC0E2D0DDL, (DWORD) 0xCDA1F604L, (DWORD) 0xC960EBB3L ,(DWORD) 0xBD3E8D7EL, (DWORD) 0xB9FF90C9L, (DWORD) 0xB4BCB610L, (DWORD) 0xB07DABA7L, (DWORD) 0xAE3AFBA2L ,(DWORD) 0xAAFBE615L, (DWORD) 0xA7B8C0CCL, (DWORD) 0xA379DD7BL, (DWORD) 0x9B3660C6L, (DWORD) 0x9FF77D71L ,(DWORD) 0x92B45BA8L, (DWORD) 0x9675461FL, (DWORD) 0x8832161AL, (DWORD) 0x8CF30BADL, (DWORD) 0x81B02D74L ,(DWORD) 0x857130C3L, (DWORD) 0x5D8A9099L, (DWORD) 0x594B8D2EL, (DWORD) 0x5408ABF7L, (DWORD) 0x50C9B640L ,(DWORD) 0x4E8EE645L, (DWORD) 0x4A4FFBF2L, (DWORD) 0x470CDD2BL, (DWORD) 0x43CDC09CL, (DWORD) 0x7B827D21L ,(DWORD) 0x7F436096L, (DWORD) 0x7200464FL, (DWORD) 0x76C15BF8L, (DWORD) 0x68860BFDL, (DWORD) 0x6C47164AL ,(DWORD) 0x61043093L, (DWORD) 0x65C52D24L, (DWORD) 0x119B4BE9L, (DWORD) 0x155A565EL, (DWORD) 0x18197087L ,(DWORD) 0x1CD86D30L, (DWORD) 0x029F3D35L, (DWORD) 0x065E2082L, (DWORD) 0x0B1D065BL, (DWORD) 0x0FDC1BECL ,(DWORD) 0x3793A651L, (DWORD) 0x3352BBE6L, (DWORD) 0x3E119D3FL, (DWORD) 0x3AD08088L, (DWORD) 0x2497D08DL ,(DWORD) 0x2056CD3AL, (DWORD) 0x2D15EBE3L, (DWORD) 0x29D4F654L, (DWORD) 0xC5A92679L, (DWORD) 0xC1683BCEL ,(DWORD) 0xCC2B1D17L, (DWORD) 0xC8EA00A0L, (DWORD) 0xD6AD50A5L, (DWORD) 0xD26C4D12L, (DWORD) 0xDF2F6BCBL ,(DWORD) 0xDBEE767CL, (DWORD) 0xE3A1CBC1L, (DWORD) 0xE760D676L, (DWORD) 0xEA23F0AFL, (DWORD) 0xEEE2ED18L ,(DWORD) 0xF0A5BD1DL, (DWORD) 0xF464A0AAL, (DWORD) 0xF9278673L, (DWORD) 0xFDE69BC4L, (DWORD) 0x89B8FD09L ,(DWORD) 0x8D79E0BEL, (DWORD) 0x803AC667L, (DWORD) 0x84FBDBD0L, (DWORD) 0x9ABC8BD5L, (DWORD) 0x9E7D9662L ,(DWORD) 0x933EB0BBL, (DWORD) 0x97FFAD0CL, (DWORD) 0xAFB010B1L, (DWORD) 0xAB710D06L, (DWORD) 0xA6322BDFL ,(DWORD) 0xA2F33668L, (DWORD) 0xBCB4666DL, (DWORD) 0xB8757BDAL, (DWORD) 0xB5365D03L, (DWORD) 0xB1F740B4L }; DWORD CRC_Calc(unsigned char * pU8section, DWORD U16length) { char msg[80]={0}; ULONG crc = 0xffffffff; U16length -= 4; while( U16length--) { sprintf(msg,"Byte: 0x%02X",*pU8section); printTexboxLine(msg); crc = (crc << 8) ^ crc32tab[((crc >> 24) ^ *(pU8section++)) & 0xff]; } printTexboxLine(""); U16length = 4; while( U16length--) { sprintf(msg,"Byte: 0x%02X",*pU8section); printTexboxLine(msg); crc = (crc << 8) ^ crc32tab[((crc >> 24) ^ *(pU8section++)) & 0xff]; } return (crc); } //The code calling the above functions follows below: int main (int argc, char *argv[]) { if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */ CRC_Init(); //Need to be called before any other CRC functions!! gPh = LoadPanel (0, "test_crc.uir", PANEL); DisplayPanel (gPh); RunUserInterface (); /* Free resources and return */ DiscardPanel (gPh); CloseCVIRTE (); return 0; } /* *captured live date time packet with optional tot * * */ void stufftdt(unsigned char *array) { *array++ = 0x47; //ts header start *array++ = 0x40; // *array++ = 0x14; // *array++ = 0x1F; //ts header end *array++ = 0x00; //.... table start *array++ = 0x70; // tdt table_id *array++ = 0x70; *array++ = 0x05; *array++ = 0xD6; *array++ = 0x18; *array++ = 0x09; *array++ = 0x14; *array++ = 0x20; *array++ = 0x73; //tot table_id --CRC32 generated from this point until the byte before the CRC32 bytes *array++ = 0x70; //various bits, lower nibble plus next byte is section length *array++ = 0x27;// previous nibble + this is section length ie x027 = 39 bytes including crc at the end *array++ = 0xD6; *array++ = 0x18; *array++ = 0x09; *array++ = 0x14; *array++ = 0x20; *array++ = 0xF0; *array++ = 0x1C; *array++ = 0x58; *array++ = 0x1A; *array++ = 0x47; *array++ = 0x42; *array++ = 0x52; *array++ = 0x02; *array++ = 0x00; *array++ = 0x00; *array++ = 0xD6; *array++ = 0x87; *array++ = 0x00; *array++ = 0x59; *array++ = 0x59; *array++ = 0x01; *array++ = 0x00; *array++ = 0x49; *array++ = 0x52; *array++ = 0x4C; *array++ = 0x02; *array++ = 0x00; *array++ = 0x00; *array++ = 0xD6; *array++ = 0x87; *array++ = 0x00; *array++ = 0x59; *array++ = 0x59; *array++ = 0x01; *array++ = 0x00; *array++ = 0x4F; //CRC Bytes from here *array++ = 0x49; // | *array++ = 0x97; // | *array++ = 0xB8; // To here. } int CVICALLBACK cbtestcrc (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { unsigned char ts[188]={0}; char msg[80]={0}; DWORD crc; int n,l; switch (event) { case EVENT_COMMIT: memset((void*)&ts,0xFF,sizeof(ts)); stufftdt(ts); for(n=13;n<=13;n++) //Check CRC value is correct - should get 0x00 if CRC is correct { l=55-n; crc = CRC_Calc(&ts[n], l); //CRC_Make(&ts[n], l); sprintf(msg,"start: 0x%02X, end: 0x%02X, length: %d, crc: 0x%08X\n\n",ts[n],ts[n+l-1],l,crc); printTexboxLine(msg); } stufftdt(ts); for(n=13;n<=13;n++) //Calculate CRC value { l=51-n; crc = CRC_Make(&ts[n], l); sprintf(msg,"start: 0x%02X, end: 0x%02X, length: %d, crc: 0x%08X",ts[n],ts[n+l-1],l,crc); printTexboxLine(msg); } break; } return 0; }
Post a reply
Quick links
Recent activity
- arif ahmad replied to How to receive data in web ...
- William Thompson replied to What is the name of the Win...
- Sameera Piyadigamage replied to Point of Sale Developers: H...
- Scott Carline replied to 4 x C# Developers for large...
- Rajendra Dhakal replied to Restore SQL Server text dat...
- cloud rainda replied to How to convert between TS f...
No one has replied yet! Why not be the first?
Sign in or Join us (it's free).