对文件或数据进行CRC校验

用于对一个文件进行CRC校验,以确保文件数据传输的正确性。

废话不多说,直接上代码!

crc32.h

#ifndef CRC_32_H
#define CRC_32_H
#ifdef __cplusplus
extern "C" {
#endif
	void init_crc_table(void);
	unsigned int crc32(unsigned int crc,unsigned char *buffer, unsigned int size);
	int calc_img_crc(const char *in_file, unsigned int *img_crc);
#ifdef __cplusplus
}
#endif
#endif

crc32.c

#include <stdlib.h>
/*****************************************************
 ** Name         : crc32.c
 ** Author       :
 ** Version      : 1.0
 ** Date         :
 ** Description  : CRC32 Checking
 ******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>   

#define BUFSIZE     1024*4   

static unsigned int crc_table[256];
const static char * program_name = "crc32";  

/*
 **初始化crc表,生成32位大小的crc表
 */
void init_crc_table(void)
{
    unsigned int c;
    unsigned int i, j;  

    for (i = 0; i < 256; i++) {
        c = (unsigned int)i;
        for (j = 0; j < 8; j++) {
            if (c & 1)
                c = 0xedb88320L ^ (c >> 1);
            else
                c = c >> 1;
        }
        crc_table[i] = c;
    }
}  

/*计算buffer的crc校验码*/
unsigned int crc32(unsigned int crc,unsigned char *buffer, unsigned int size)
{
    unsigned int i;
    for (i = 0; i < size; i++) {
        crc = crc_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);
    }
    return crc ;
}  

/*
 **计算大文件的CRC校验码:crc32函数,是对一个buffer进行处理,
 **但如果一个文件相对较大,显然不能直接读取到内存当中
 **所以只能将文件分段读取出来进行crc校验,
 **然后循环将上一次的crc校验码再传递给新的buffer校验函数,
 **到最后,生成的crc校验码就是该文件的crc校验码.
 */
int calc_img_crc(const char *in_file, unsigned int *img_crc)
{
    int fd;
    int nread;
    int ret;
    unsigned char buf[BUFSIZE];
    /*第一次传入的值需要固定,如果发送端使用该值计算crc校验码,
     **那么接收端也同样需要使用该值进行计算*/
    unsigned int crc = 0xffffffff;   

    fd = open(in_file, O_RDONLY);
    if (fd < 0) {
        printf("%d:open %s.\n", __LINE__, strerror(errno));
        return -1;
    }  

    while ((nread = read(fd, buf, BUFSIZE)) > 0) {
        crc = crc32(crc, buf, nread);
    }
    *img_crc = crc;  

    close(fd);  

    if (nread < 0) {
        printf("%d:read %s.\n", __LINE__, strerror(errno));
        return -1;
    }  

    return 0;
}  

/*
int main(int argc, char **argv)
{
    int ret;
    unsigned int img_crc;
    const char *in_file = argv[1];  

    if (argc < 2) {
        exit(1);
    }  

    init_crc_table();  

    ret = calc_img_crc(in_file, &img_crc);
    if (ret < 0) {
        exit(1);
    }  

    printf("The crc of %s is:%u\n", in_file, img_crc);  

    return 0;
}
*/

对文件进行校验:

         init_crc_table();
         unsigned int bin_crc;
         calc_img_crc(argv[1],&bin_crc);

对buf 中的数据校验:

     init_crc_table();
     unsigned int binCrcNew = 0xFFFFFFFF;
     binCrcNew = crc32(binCrcNew, (unsigned char*)fwBuff, binLen);

最简单的Makefile试例:

all: encryptBIN
encryptBIN:encryptBIN.cpp crc32.c
	gcc -c crc32.c -o crc32.o
	g++ -c encryptBIN.cpp -o encryptBIN.o
	gcc crc32.o encryptBIN.o -lstdc++ -o encryptBIN
clean:
	rm -rf *.o encryptBIN
时间: 2024-10-15 19:57:32

对文件或数据进行CRC校验的相关文章

基于STM32的CRC校验说明

///***************************************************************************** //下面是test.c里面的函数 ///***************************************************************************** ///////////////////////////////////////////////////////////////////////

[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误.它是利用除法及余数的原理来作错误侦测的. FCS,全称Frame Check Sequence,中文名称为帧校验序列,俗称帧尾,即计算机网络数据链路层的协议数据单元(帧)的尾部字段,是一段4个字节的循环冗余校验码. 注:CRC循环冗余校验和FCS帧校验序列是

物联网平台设计心得:你所不知道的CRC校验

在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC认证到底是什么呢?所谓的CRC认证,就是指,在硬件端或者用户端进行数据传输前,通过一套算法,将待传输的数据,通过加验,算出其校验码,附加在包体的最后,然后中间件收到此包后,对包进行解析,拿出其中的数据内容部分,然后对包重新进行一次CRC加验,如果本次加验结果和包体附带的CRC校验码数据一致,那么就说

CRC校验程序3:通过窗体程序打开txt文件获取数据源,进行逐字节CRC校验

在上一篇中,生成输出的CRC.exe将要成为这个窗体应用的内置模块. 新建一个windows窗体应用程序,叫做CRClick.将应用程序CRC.exe从Console应用程序中找到,复制到CRClick文件夹的Debuge文件夹下.同时还有测试用的Test.txt. 打开窗体设计页面,插入两个Textbox和一个按钮,长度Textbox用来显示被校验的文件的绝对路径,短Textbox显示最终校验码.按钮激发选择文件的窗口.设计如下: 对于按钮的触发事件,我们生成一个OpenFileDialog控

Redis源码中的CRC校验码(crc16、crc64)原理浅析

在阅读Redis源码的时候,看到了两个文件:crc16.c.crc64.c.下面我抛砖引玉,简析一下原理. CRC即循环冗余校验码,是信息系统中一种常见的检错码.大学课程中的"计算机网络"."计算机组成"等课程中都有提及.我们可能都了解它的数学原理,在试卷上手工计算一个CRC校验码,并不是难事.但是计算机不是人,现实世界中的数学原理需要转化为计算机算法才能实现目的.实际上作为计算机专业背景人并不会经常使用或接触到CRC的计算机算法实现的原理,通常是电子学科背景的人士

CRC校验程序2:通过命令提示符加载文本文档作为数据源进行CRC校验,输出校验码

将CRC校验函数封装在类中,通过控制台传参(文件的相对路径),进行CRC校验. 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace CRC 9 { 10 class Program 11 { 12 static void Main(s

CRC校验程序1:CRC循环冗余校验码计算

CRC全称Cyclic Redundancy Check,中文称为循环冗余检查.它是一种数据传输检错的机制,能够对数据进行多项式计算,并将得到的结果与接收设备共享,保证数据传输的正确性和完整性. 算法流程如下: 1. Load a 16-bit register with FFFF hex (all ‘1’s). Call this the CRC register. 2. Exclusive OR the first 8-bit byte of the message with the low

八,ESP8266 文件保存数据

应该是LUA介绍8266的最后一篇,,,,,,下回是直接用SDK,,然后再列个12345.......不过要等一两个星期,先忙完朋友的事情 前面几篇 用AT指令版本的 一,  http://www.cnblogs.com/yangfengwu/p/5205570.html    发AT指令,,其实AT指令就是事先用SDK内部写好了 二,  http://www.cnblogs.com/yangfengwu/p/5295632.html    这个呢是配合路由器实现远程,,其实可以买个域名,或者用

CRC校验的实现

[好长时间没更blog了::>_<::] 计算机网络课学习了CRC校(jiao)验的基本原理,不过课上学的那点东西只够做考试题的= =,于是想试试写一个对文件CRC校验的小程序 先来回顾下CRC校验的最基本原理: 核心思想:其实和hash很像...就是mod 设M是源文件,G是校验用的一串数(由CRC标准指定) 首先将M通过加校验变成N,以满足N mod G==0   (其中mod就是课本上那个模二不进位除法) 然后将N通过网络发送出去,在destination收到数据包Q destinati