#defineCRC32_POLYNOMIAL0xEDB88320L/* --------------------------------------------------------------------------
Calculate a CRC value to be used by CRC calculation functions.
-------------------------------------------------------------------------- */unsignedlongcrc32_value(int i){int j;unsignedlong ulCRC;
ulCRC = i;for( j =8; j >0; j--){if( ulCRC &1){
ulCRC =( ulCRC >>1)^ CRC32_POLYNOMIAL;}else{
ulCRC >>=1;}}return ulCRC;}/* --------------------------------------------------------------------------
Calculates the CRC-32 of a block of data all at once
ulCount - Number of bytes in the data block
ucBuffer - Data block
-------------------------------------------------------------------------- */uint32_tcalculate_crc32(constuint8_t*data,size_t length){uint32_t ulTemp1;uint32_t ulTemp2;uint32_t ulCRC =0;while( length--!=0){
ulTemp1 =( ulCRC >>8)&0x00FFFFFFL;
ulTemp2 =crc32_value(((int) ulCRC ^*data++)&0xFF);
ulCRC = ulTemp1 ^ ulTemp2;}return( ulCRC );}