CRC代码实例

本文详细介绍了在C语言和Python中实现CRC32校验算法,包括单个字节的crc32_value函数和整块数据的calculate_crc32函数,展示了两种编程语言处理数据校验的基本过程。
摘要由CSDN通过智能技术生成

基于C语言实现

#define CRC32_POLYNOMIAL 0xEDB88320L
/* --------------------------------------------------------------------------

Calculate a CRC value to be used by CRC calculation functions.

-------------------------------------------------------------------------- */
unsigned long crc32_value(int i) {
     int j;
     unsigned long 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_t calculate_crc32( const uint8_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 );
}

基于Python实现

CRC32_POLYNOMIAL = 0xEDB88320
def crc32_value(i):
    ulCRC = i

    for j in range(8, 0, -1):
        if ulCRC & 1:
            ulCRC = (ulCRC >> 1) ^ CRC32_POLYNOMIAL
        else:
            ulCRC >>= 1

    return ulCRC

def calculate_crc32(data):
    ulTemp1 = 0
    ulTemp2 = 0
    ulCRC = 0

    for byte in data:
        ulTemp1 = (ulCRC >> 8) & 0x00FFFFFF
        ulTemp2 = crc32_value((ulCRC ^ byte) & 0xFF)
        ulCRC = ulTemp1 ^ ulTemp2
    return ulCRC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值