精华内容
下载资源
问答
  • crc校验码c语言
    2021-05-19 15:27:28

    typedef    unsigned char     uchar;

    typedef    unsigned int      uint;

    typedef    unsigned short      uInt16;

    uint crc;                  // CRC 码

    uint crc16l(uchar *ptr,uchar len)        // ptr 为数据指针,len 为数据长度

    {

    uInt16 i,j,tmp,CRC16;

    CRC16=0xffff;

    for (i=0;i

    {

    CRC16=*ptr^CRC16;

    for (j=0;j< 8;j++)

    {

    tmp=CRC16 & 0x0001;

    CRC16 =CRC16 >>1;

    if (tmp)

    CRC16=CRC16 ^ 0xa001;

    }

    *ptr++;

    }

    return(CRC16);

    }

    (1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;

    (2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低

    8位相异或,把结果放于CRC寄存器,高八位数据不变;

    (3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;

    (4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多

    项式A001(1010 0000 0000 0001)进行异或;

    (5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;

    (6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;

    (7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低

    字节进行交换;

    (8)、最后得到的CRC寄存器内容即为:CRC码。

    以上计算步骤中的多项式A001是8005按位颠倒后的结果。

    更多相关内容
  • CRC校验码C语言实现

    2022-01-05 18:27:20
    printf("CRC校验码为:"); nl=convertBinaryToDecimal(n); kl=convertBinaryToDecimal(k); int r=mod(nl,kl); turnb(r); printf("\n最终的发送数据为:"); nl=nl(shi(kl)-1); nl=nl^r; turnb(nl); printf("\n\n"); } ...

    时间与空间不可得兼。。我选择空间。。空间复杂度还是很低的。。

    #include <stdio.h>
    int shi(int n){
        return (n>0)?shi(n=n>>1)+1:0;
        }
    
    void turnb(int n){
        if(n!=0){
            turnb(n>>1);
            printf("%d",n&1);
            }
    }
    int convertBinaryToDecimal(long long n)
    {
        int decimalNumber = 0, i = 0, remainder;
        while (n>0)
        {
            remainder = n%10;
            n /= 10;
            decimalNumber += remainder*(1<<i);
            ++i;
        }
        return decimalNumber;
    }
    
    int mod(int n,int k){
        int lenn=shi(n),lenk=shi(k);
        n=n<<(lenk-1);
        k=k<<(lenn-1);
        int m=0;
        int midlen;
        int reg=n;
        for(;;){
            reg=reg^k;
            midlen=shi(reg);
            if(midlen<lenk)break;
            k=k>>(shi(k)-midlen);
        }
        return reg;
    }            
            
    int main(int argc, char** argv){
        long long n,k;
        int nl,kl;
        while(1){
            printf("输入要发送的数据:");
            scanf("%lld",&n);
            printf("输入CRC生成多项式:");
            scanf("%lld",&k);
            printf("CRC校验码为:");
            nl=convertBinaryToDecimal(n);
            kl=convertBinaryToDecimal(k);
            int r=mod(nl,kl);
            turnb(r);
            printf("\n最终的发送数据为:");
            nl=nl<<(shi(kl)-1);
            nl=nl^r;
            turnb(nl);
            printf("\n\n");
        }
        return 0;
      }
    
    展开全文
  • CRC校验C语言实现

    千次阅读 2022-02-18 10:44:50
    摘自:CRC校验原理及其C语言实现 地址:https://blog.csdn.net/whik1194/article/details/108837493?spm=1001.2014.3001.5502

    摘自:CRC校验原理及其C语言实现
    地址:https://blog.csdn.net/whik1194/article/details/108837493?spm=1001.2014.3001.5502

    什么是校验算法

    最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一下笔记。

    一个完整的数据帧通常由以下部分构成:
    在这里插入图片描述

    校验位是为了保证数据在传输过程中的完整性,采用一种指定的算法对原始数据进行计算,得出的一个校验值。接收方接收到数据时,采用同样的校验算法对原始数据进行计算,如果计算结果和接收到的校验值一致,说明数据校验正确,这一帧数据可以使用,如果不一致,说明传输过程中出现了差错,这一帧数据丢弃,请求重发。

    常用的校验算法有奇偶校验、校验和、CRC,还有LRC、BCC等不常用的校验算法

    串口通讯中的奇校验为例,如果数据中1的个数为奇数,则奇校验位0,否则为1。

    例如原始数据为:0001 0011,数据中1的个数(或各位相加)为3,所以奇校验位为0。这种校验方法很简单,但这种校验方法有很大的误码率。假设由于传输过程中的干扰,接收端接收到的数据是0010 0011,通过奇校验运算,得到奇校验位的值为0,虽然校验通过,但是数据已经发生了错误。
    在这里插入图片描述
    校验和同理也会有类似的错误:
    在这里插入图片描述
    一个好的校验校验方法,配合数字信号编码方式,如(差分)曼彻斯特编码,(不)归零码等对数据进行编码,可大大提高通信的健壮性和稳定性。例如以太网中使用的是CRC-32校验,曼彻斯特编码方式。本篇文章介绍CRC校验的原理和实现方法。

    CRC算法简介

    循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

    CRC校验计算速度快,检错能力强,易于用编码器等硬件电路实现。从检错的正确率与速度、成本等方面,都比奇偶校验等校验方式具有优势。因而,CRC 成为计算机信息通信领域最为普遍的校验方式。常见应用有以太网/USB通信,压缩解压,视频编码,图像存储,磁盘读写等。

    CRC参数模型

    不知道你是否遇到过这种情况,同样的CRC多项式,调用不同的CRC计算函数,得到的结果却不一样,而且和手算的结果也不一样,这就涉及到CRC的参数模型了。计算一个正确的CRC值,需要知道CRC的参数模型。

    一个完整的CRC参数模型应该包含以下信息:WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT。

    • NAME:参数模型名称。

    • WIDTH:宽度,即生成的CRC数据位宽,如CRC-8,生成的CRC为8位

    • POLY:十六进制多项式,省略最高位1,如 x8 + x2 + x + 1,二进制为1 0000 0111,省略最高位1,转换为十六进制为0x07。

    • INIT:CRC初始值,和WIDTH位宽一致。

    • REFIN:true或false,在进行计算之前,原始数据是否翻转,如原始数据:0x34 = 0011 0100,如果REFIN为true,进行翻转之后为0010 1100 = 0x2c

    • REFOUT:true或false,运算完成之后,得到的CRC值是否进行翻转,如计算得到的CRC值:0x97 = 1001 0111,如果REFOUT为true,进行翻转之后为11101001 = 0xE9。

    • XOROUT:计算结果与此参数进行异或运算后得到最终的CRC值,和WIDTH位宽一致。

    通常如果只给了一个多项式,其他的没有说明则:INIT=0x00,REFIN=false,REFOUT=false,XOROUT=0x00。

    常用的21个标准CRC参数模型:

    在这里插入图片描述

    CRC校验在电子通信领域非常常用,可以说有通信存在的地方,就有CRC校验:

    • 美信(MAXIM)的芯片DS2401/DS18B20,都是使用的CRC-8/MAXIM模型
    • SD卡或MMC使用的是CRC-7/MMC模型
    • Modbus通信使用的是CRC-16/MODBUS参数模型
    • USB协议中使用的CRC-5/USB和CRC-16/USB模型
    • STM32自带的硬件CRC计算模块使用的是CRC-32模型

    至于多项式的选择,初始值和异或值的选择,输入输出是否翻转,这就涉及到一定的编码和数学知识了。感兴趣的朋友,可以了解一下每个CRC模型各个参数的来源。至于每种参数模型的检错能力、重复率,需要专业的数学计算了,不在本文讨论的范畴内。

    CRC计算

    好了,了解了CRC参数模型知识,下面手算一个CRC值,来了解CRC计算的原理。

    问:原始数据:0x34,使用CRC-8/MAXIN参数模型,求CRC值?

    答:根据CRC参数模型表,得到CRC-8/MAXIN的参数如下:

    POLY = 0x31 = 0011 0001(最高位1已经省略)
    INIT = 0x00
    XOROUT = 0x00
    REFIN = TRUE
    REFOUT = TRUE
    

    有了上面的参数,这样计算条件才算完整,下面来实际计算:

    0.原始数据 = 0x34 = 0011 0100,多项式 = 0x31 = 1 0011 0001
    1.INIT = 00,原始数据高8位和初始值进行异或运算保持不变。
    2.REFIN为TRUE,需要先对原始数据进行翻转:0011 0100 > 0010 1100
    3.原始数据左移8位,即后面补800010 1100 0000 0000
    4.把处理之后的数据和多项式进行模2除法,求得余数:
    原始数据:0010 1100 0000 0000 = 10 1100 0000 0000
    多项式:1 0011 00012除法取余数低8位:1111 1011
    5.与XOROUT进行异或,1111 1011 xor 0000 0000 = 1111 1011 
    6.因为REFOUT为TRUE,对结果进行翻转得到最终的CRC-8值:1101 1111 = 0xDF
    7.数据+CRC:0011 0100 1101 1111 = 34DF,相当于原始数据左移8+余数。
    

    模2除法求余数:
    在这里插入图片描述
    验证手算结果:
    在这里插入图片描述
    可以看出是一致的,当你手算的结果和工具计算结果不一致时,可以看看INIT,XOROUT,REFINT,REFOUT这些参数是否一致,有1个参数不对,计算出的CRC结果都不一样。

    CRC校验

    上面通过笔算的方式,讲解了CRC计算的原理,下面来介绍一下如何进行校验。

    按照上面CRC计算的结果,最终的数据帧:0011 0100 1101 1111 = 34DF,前8位0011 0100是原始数据,后8位1101 1111 是 CRC结果。

    接收端的校验有两种方式,一种是和CRC计算一样,在本地把接收到的数据和CRC分离,然后在本地对数据进行CRC运算,得到的CRC值和接收到的CRC进行比较,如果一致,说明数据接收正确,如果不一致,说明数据有错误。

    另一种方法是把整个数据帧进行CRC运算,因为是数据帧相当于把原始数据左移8位,然后加上余数,如果直接对整个数据帧进行CRC运算(除以多项式),那么余数应该为0,如果不为0说明数据出错。

    在这里插入图片描述

    而且,不同位出错,余数也不同,可以证明,余数与出错位数的对应关系只与CRC参数模型有关,而与原始数据无关。

    CRC计算的C语言实现

    无论是用C还是其他语言,实现方法网上很多,这里我找了一个基于C语言的CRC计算库,里面包含了常用的21个CRC参数模型计算函数,可以直接使用,只有crcLib.ccrcLib.h两个文件。

    • GitHub地址:https://github.com/whik/crc-lib-c
    • Gitee地址:https://gitee.com/whik/crc-lib-c

    使用方法非常简单:

    案例一:

    #include <stdio.h>
    #include <stdlib.h>
    #include "crcLib.h"
    
    int main()
    {
        uint8_t data;
        uint8_t crc;
    
        data = 0x34;
        crc = crc8_maxim(&data, 1);
    
        printf("data:%02x, crc:%02x\n", data, crc); 
        return 0;
    }
    

    在这里插入图片描述

    案例二:

    #include <stdio.h>
    #include <stdlib.h>
    #include "crcLib.h"
    
    int main()
    {
        uint8_t LENGTH = 10;
        uint8_t data[LENGTH];
        uint8_t crc;
    
        for(int i = 0; i < LENGTH; i++)
        {
            data[i] = i*5;
            printf("%02x ", data[i]);
        }
        printf("\n");
    
        crc = crc8_maxim(data, LENGTH);
    
        printf("CRC-8/MAXIM:%02x\n", crc);
        return 0;
    }
    

    计算结果:

    在这里插入图片描述

    在这里插入图片描述

    CRC计算工具

    下面这几款工具都可以自定义CRC算法模型,而且都有标准CRC模型可供选择。如果自己用C语言或者Verilog实现校验算法时,非常适合作为标准答案进行验证。

    • 在线计算:www.ip33.com/crc.html
    • 离线计算工具:CRC_Calc v0.1.exe或者GCRC.exe

    格西CRC计算器:
    在这里插入图片描述

    总结

    CRC校验并不能100%的检查出数据的错误,非常低的概率会出现CRC校验正确但数据中有错误位的情况。这和CRC的位数,多项式的选择等等有很大的关系,所以在实际使用中尽量选择标准CRC参数模型,这些多项式参数都是经过理论计算得出的,可以提高CRC的检错能力。CRC校验可以检错,也可以纠正单一比特的错误,你知道纠错的原理吗?

    参考资料
    https://www.cnblogs.com/liushui-sky/p/9962123.html
    https://segmentfault.com/a/1190000018094567

    展开全文
  • 本篇文章是对使用C语言实现CRC校验的方法进行了详细的分析介绍,需要的朋友参考下
  • CRC校验算法——C语言实现

    千次阅读 2022-03-02 10:17:53
    CRC校验的作用: 一般用于通信过程中,验证数据完整性;数据有无丢失。 校验原理&程序设计流程图 C程序验证 源码 #include <stdio.h> unsigned short RTU_CRC( unsigned char * puchMsg, unsigned ...

    CRC校验的作用:

    一般用于通信过程中,验证数据完整性;数据有无丢失。
    

    校验原理&程序设计流程图请添加图片描述

    CRC16——C程序验证

    1. 源码
    #include <stdio.h>
    unsigned short RTU_CRC( unsigned char * puchMsg, unsigned short usDataLen );
    
    int main(){
    	
    	int DateLen=11;
    	unsigned char crc[] = {0x0B,0xC1,0x08,0x21,0x92,0x64,0x10,0xD1,0x02,0x01,0x02};	
    	//check:AE B1"	 校验位,校验结果
    	
    	for (int i=0; i<DateLen; i++){
    		printf("%02X",crc[i]);
    	}
    	printf("---CRC check = %0X", RTU_CRC(crc,DateLen));
    	return 0;
    }
    // crc校验表
    static const unsigned char auchCRCHi[] = {
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80,
    0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1,
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
    0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,
    0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,
    0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40};
    // -----------------------------------------------------------------------------
    // DESCRIPTION: RTU CRC 3校验的低位字节表3
    // -----------------------------------------------------------------------------
    static const unsigned char auchCRCLo[] = {
    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5,
    0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B,
    0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE,
    0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6,
    0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2,
    0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F,
    0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB,
    0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25,
    0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
    0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C,
    0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8,
    0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D,
    0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73,
    0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57,
    0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A,
    0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E,
    0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86,
    0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40};
    // 3校验函数3
    /*nodebug*/ unsigned short RTU_CRC( unsigned char * puchMsg, unsigned short usDataLen )
    {
    	unsigned char uchCRCHi; // high 字节 of CRC initialized
    	unsigned char uchCRCLo; // low 字节 of CRC initialized
    	unsigned uIndex; // will index into CRC lookup table
    	uchCRCHi = 0xFF;
    	uchCRCLo = 0xFF;
    	
    	while ( usDataLen-- )
    	{
    	// calculate the CRC
    		uIndex = uchCRCLo ^ (unsigned char)( *puchMsg++ );
    		uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex];
    		uchCRCHi = auchCRCLo[uIndex];
    	} 
    	return ( uchCRCHi << 8 | uchCRCLo );
    }
    
    1. 执行结果

      0BC10821926410D1020102---CRC check = AEB1
      
    展开全文
  • CRC校验以及c语言代码实现

    千次阅读 2019-11-01 16:07:01
    //CRC4 #include <stdint.h> #include <stdio.h> #define POLYNOMIAL 0xC8 /* 11011后面补0凑8位数:11011000*/ uint8_t CheckCrc4(uint8_t const message) { uint8_t remainder; //余数 uint8_t ...
  • 算法之CRC16校验C语言

    千次阅读 2021-05-26 17:21:23
    #include <stdio.h> #include <stdlib.h> unsigned short getCRC16... unsigned short crc = 0xFFFF; if(ptr==0) { return 0; } if(len==0) { len = 1; } //if(len<=255
  • CRC校验原理及其C语言实现

    千次阅读 多人点赞 2020-09-27 22:00:06
    文章目录目录前言CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结参考资料 目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对...
  • 海明CRC校验C语言实现.doc海明CRC校验C语言实现海明//code by zxf 2010.4.10#include #include #include //N代表待编码数据的上限位数#define N 100int HmLength(int k);//计算海明校验位位数void ...
  • 错误检测的方法错误校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不...
  • CRC16校验码C语言代码实现,用于数据通信中的校验。
  • CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制
  • CRC校验C语言实现

    千次阅读 2018-09-03 19:55:00
    文章转自 循环冗余校验CRC)算法入门引导 - Ivan 的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liyuanbhu/article/details/7882789     一、原理部分 CRC 算法的基本思想是将传输的数据当做一个...
  • CRC校验码 C语言实现 一种方法

    千次阅读 2011-10-23 17:23:10
    \n\n------CRC校验码-------数据以16进制输入 " );    while (tmp -- )   {    printf( " \nPlease input 校验数据:\n>> " );  scanf( " %x " , & MD);  printf( " Please input 多项式...
  • C语言CRC校验

    2021-05-20 12:51:08
    一、CRCCRC:Cylic Reduancy check译作汉语就是循环冗余校验码。二、XORXOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。三、用XOR代替算术运算上除法的两个例子。1、10110010000/...
  • CRC循环校验C语言标准版实验程序

    千次阅读 2019-05-15 17:34:21
    本来已经写过一篇相关的文章,但总觉得跟书本上定义的实现算法不一样很不爽,所以按照书本上的定义,...首先是算法——完全按照教材规定的计算信息、冗余的方式编写测试的,如果不清楚请先自行百度“crc校验”;...
  • modbus RTU CRC16校验函数 C语言
  • CRC16校验码C语言实现

    千次阅读 2018-02-09 15:26:48
    一、目的 阐述CRC16的原理,并以C语言代码实现。二、 校验码的作用 校验码用于校验数据的有效性/正确性。...三、 CRC校验码生成过程 任意一个数据序列都可以用二进制表示,如整数123可以用二进制表示为1111011B。...
  • CRC16校验 C语言实现

    千次阅读 2020-11-13 09:03:47
    循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的...
  • } //CRC4校验演示 void main() { char inbuf[100], fcs[100]; //输入缓冲区 FCS缓冲区 int i=0,j=0; printf("\n输入M:"); scanf("%s",inbuf); while(inbuf[0]!='0' || inbuf[1]!='\0'){ printf("FCS:"); ...
  • CRC校验C语言代码实现

    2021-09-15 16:06:20
    CRC校验码原理、实例、手动计算 - 步孤天 - 博客园(解释移位原理) https://blog.csdn.net/mish84/article/details/27528125(解释代码) //CRC16实现代码 uint16_t CrcSum(uint8_t *ptr, uint16_t len) { ...
  • CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式...CRC校验码的计算示例 由以上分析可知,既然除数是随机,或者按标准选定的,所以CRC校验的关键是如何求出余数,也就是CRC校验码
  • 协议也是起始帧加数据帧加CRC校验。特此系统记录一下crc校验。 CRC概念 首先crc就是一个附在一串报文后面的一个16位二进制的数,由发送设备计算。接受的设备在接收报文后重新计算CRC,然后把这个值和接收到的CRC数据...
  • CRC校验C语言实现

    万次阅读 2019-06-08 18:16:08
    1.参考资料 ...本文首先参考了链接2的博客,上面讲的很详细,从奇偶校验、累加和校验、模2运算到CRC校验和优化。并提供了相应的参考链接,很值得参考。如果要深入理解算法的实现原理需要参考链接1...
  • static const uint32_t crc32tab[] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,665
精华内容 1,466
关键字:

crc校验码c语言