CRC32算法实现:python与C

本文介绍了CRC32校验算法在嵌入式开发中的应用,并分别展示了Python和C语言实现CRC32的详细过程。通过Python的zlib和binascii模块以及C语言的查表法,实现了CRC32的计算。测试表明,两种语言计算同一数据的CRC32值是一致的。
摘要由CSDN通过智能技术生成

背景

CRC32这种轻量级的校验算法在嵌入式开发中使用非常广泛,比如User data的存储,非关键数据的
保存(对于重要数据,一般不建议只用CRC32去校验其完整性,还会考虑加密处理).在PC端常用脚本
语言(例如python)去生成CRC32校验值值,而在嵌入式设备端,由于设备端能力有限,会直接使用C编写的程序去
做CRC32校验;

python实现CRC32校验算法

python实现crc32(同时有md5和sha1校验算法demo)算法如下:

#!/usr/bin/python

import sys
import os
from zlib import crc32
import hashlib 
import binascii

def getcrc32(filepath):
    file = open(filepath,'rb')
    return crc32(file.read())

def getbinasciiCRC(filepath):
    file = open(filepath,'rb')
    return (binascii.crc32(file.read())&0xffffffff)

def getmd5(filepath):
    file = open(filepath,'rb')
    md5func = hashlib.md5()
    md5func.update(file.read()) 
    return md5func.hexdigest()

def getsha1(filepath):
    file = open(filepath,'rb')
    sha1func = hashlib.sha1()
    sha1func.update(file.read())
    return sha1func.hexdigest()

path = sys.argv[1]
print sys.argv[0], "  ",path
print "crc32 value:%X"%(getcrc32(path)&0xffffffff)
print "binascii crc32 value:%X"%(getbinasciiCRC(path))
print "md5   value:%s"%(getmd5(path))
print "sha1  value:%s"%(getsha1(path))

该例测试用python版本为2.7.4,需要安装zlib/hashlib/binascii这三个module,在实际应用中zlib和binascii可只装其一,这两者都含有计算crc32的方法;

C实现CRC32算法

因为在嵌入式设备端的计算能力有限,所以通常的做法是使用crc32查表法去计算crc32,利用提前计算好的256个elements的table,去计算crc32(使用多项式:x^{ {32}}+x^{ {26}}+x^{ {23}}+x^{ {22}}+x^{ {16}}+x^{ {12}}+x^{ {11}}+x^{ {10}}+x^{8}+x^{7}+x^{5}+x^{4}+x^{2}+x+1);
用C实现的table生成方法如下:


static unsigned int CRC32_Table[256];
/**
 * 产生CRC32查表法所用的表,
 * 0xEDB88320:CRC32的生成项是1 0000 0100 1100 0001 0001 1101 1011 0111,去掉最高位的1,保留32bit,然后再颠倒后
 * 转换成16进制就是0xEDB88320
 */
static void _createCRCTable(void)
{
    unsigned int crc32;  
    unsigned int idx = 0;  
    unsigned int bit = 0;  

    for(idx = 0; idx < 256; idx++)  
    {  
        crc32 = idx;  

        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值