32位CRC校驗代碼

/*
 *		@param1: ucBuf
 *	 	@param1: uiLen
 *	 	@param1: uiSeed
 */
uint32_t CheckCrc32WithInitial(uint8_t *ucBuf, uint32_t uiLen, uint32_t uiSeed)
{
	uint32_t crc = uiSeed;/*0x00000000;*/
	if (NULL == ucBuf || uiLen <= 0)
	{
	    return crc;
	}

	uint8_t *ucOld = ucBuf;
	uint32_t rem = uiLen % sizeof(unsigned int);
	if (rem > 0) {
		int n = sizeof(unsigned int) - rem;
		for (int i = 0; i < n; i ++) {
			ucOld[uiLen+i] = 0xff;
		}
		uiLen += n;
	}

	uint32_t uiCount = uiLen/sizeof(unsigned int);
	for (uint32_t i = 0; i < uiCount; i ++) {
		uint32_t uiTemp = *(uint32_t *)ucOld;
		for (uint32_t j = 0; j < 32; j ++) {
			if ((crc^uiTemp) & 0x80000000) {
				crc = 0x04C11DB7^(crc<<1);
			} else {
				crc <<= 1;
			}
			uiTemp <<= 1;
		}
		ucOld += sizeof(unsigned int);
	}

	return crc;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章