背景
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;