给文件添加CRC校验 您所在的位置:网站首页 crc校验结果为何全不一样 给文件添加CRC校验

给文件添加CRC校验

2023-07-31 20:50| 来源: 网络整理| 查看: 265

crc校验

crc校验常用的有CRC16和CRC32,在通信中用的比较多(modbus协议等),这里不详细介绍其原理了。

crc校验不同多项式,计算结果是不一样的。

文件crc校验

为了保证文件的完整性,可以通过一些方法来对文件进行校验,校验的方法也挺多,使用crc16、crc32是比较简答的方式。主要是针对升级文件、配置文件等。

对文件的整体数据计算一个crc值,然后将这个校验码追加在文件的最后,这样既不影响文件属性,也不用再额外添加一个文件。校验文件时,可以对文件的所有数据进行校验然后对比校验码即可。

实现代码#include #include #include #include #include #include #include #include using namespace std; /* * 附录 A:循环冗余校验(CRC)算法 * CRC 校验(Cyclic Redundancy Check)是一种数据传输错误检查方法, CRC 码两个字 * 节,包含一 16 位的二进制值。它由传输设备计算后加入到数据包中。接收设备重新计算收 * 到消息的 CRC,并与接收到的 CRC 域中的值比较,如果两值不同,则有误。 * 具体算法如下: * CRC 是先调入一值是全“1”的 16 位寄存器,然后调用一过程将消息中连续的 8 位字 * 节各当前寄存器中的值进行处理。仅每个字符中的 8Bit 数据对 CRC 有效,起始位和停止位 * 以及奇偶校验位均无效。 * CRC 校验字节的生成步骤如下: * ① 装一个 16 位寄存器,所有数位均为 1。 * ② 取被校验串的一个字节与 16 位寄存器的高位字节进行“异或”运算。运算结果放 * 入这个 16 位寄存器。 * ③ 把这个 16 寄存器向右移一位。 * ④ 若向右(标记位)移出的数位是 1,则生成多项式 1010 0000 0000 00Q01 和这个寄 * 存器进行“异或”运算;若向右移出的数位是 0,则返回③。 * ⑤ 重复③和④,直至移出 8 位。 * ⑥ 取被校验串的下一个字节 * ⑦ 重复③~⑥,直至被校验串的所有字节均与 16 位寄存器进行“异或”运算,并移位 * 8 次。 * ⑧ 这个 16 位寄存器的内容即 2 字节 CRC 错误校验码。 * 校验码按照先高字节后低字节的顺序存放。 * * * * */ unsigned short crc16(const unsigned char *ptr, int len) // ptr 为数据指针,len 为数据长度 { unsigned int i; unsigned short j,tmp,CRC16; CRC16=0xffff; for ( i = 0; i < len; i++ ) { CRC16 = *ptr ^ CRC16; for ( j = 0; j < 8; j++ ) { tmp=CRC16 & 0x0001; CRC16 =CRC16 >>1; if (tmp) CRC16=CRC16 ^ 0xa001; } *ptr++; } return(CRC16); } unsigned short checkFile( const string &file) { struct stat stFileStat; int ret = stat(file.c_str(), &stFileStat); if ( ret < 0 ) { perror("stat error"); return false; } cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有