精华内容
下载资源
问答
  • 常用校验算法

    万次阅读 2015-01-09 16:41:14
    1、在计算机通信中为什么需要对接收的数据进行校验?  在计算机通信中,可能是点对点通信或者是广播方式通信,具有发送端设备和接收端设备。在整个通信网络或通信线路里面,存在有该设备需要的数据、其他设备...

    1、在计算机通信中为什么需要对接收的数据进行校验?

            在计算机通信中,可能是点对点通信或者是广播方式通信,具有发送端设备和接收端设备。在整个通信网络或通信线路里面,存在有该设备需要的数据、其他设备需要的数据、干扰所产生的信号(如果不处理,可能也会被当成正常数据进行处理)。同时,由于接地不好或者干扰源的问题(例如电焊机、变频器、中频炉等),可能使部分数据被干扰,数据不完整或者错误。如果这些错误或不完整的数据被执行,就可能使设备产生误动作,造成设备损坏、生产损失,甚至人身伤害。因此,就需要对这些数据进行处理,进行校验。
    2、有哪几种校验方法?并简述各种校验的实现方法? 
          正好以前我自己发过这样的贴(原创),我摘抄过来。

    原创:数据帧校验总结(CRC_LRC_PC_SC_S-XORC校验等):http://www.gongkong.com/webpage/forum/200810/2008101411312700003-1.shtml

    冗余校验: 
          在通讯时采取数据校验的一种办法。数据传输时,虽然数据的起始字符和结束字符可以避免参与通信的设备收到无用的数据信息/干扰信息,但对于起始字符和结束字符之间的数据,还是可能受到干扰而产生错误,因此对通信数据进行校验是非常必要的。校验的方法是在数据的最后加上一个冗余信息,这个信息是对数据校验的结果,所以数据校验也称之为冗余校验。循环冗余码校验是最常用的校验方法之一。

    差错检测和纠正:

           物理过程所引起的差错,在某些介质中通常是突发的而不是单个的。网络设计者已经研究出两种基本的策略来处理差错。一种方法是在每一个要发送的数据块上附加足够的冗余信息,使接收方能够推导出已发出的字符应该是什么。另一种方法是只加足够的冗余位,使接收方知道差错发生,但不知道是什么样的差错,然后要求接收方重新进行传输。前者的策略是使用纠错码(error-correcting code),而后者则使用检错码(error-detecting code)。 
    1.纠错码

           在了解纠错码之前,先了解一个基本概念:海明距离。通常一帧包括m个数据(报文)位和r个冗余位或者校验位。设整个长度为n(即n=m+r),则此长度为n的单元通常被称作n位码字(codeword)。 
    给出任意两个码字,如10001001和10110001,可以确定它们有多少个对应位不同。在此例中有3位不同。为了确定有多少位不同,只须对两个码字做异或运算,然后计算结果中1的个数。两个码字中不同位的个数,称为海明距离(Hamming Distance)。其重要性在于,假如两个码字具有海明距离d,则需要d个位差错才能将其中一个码字转换成另一个。

          一种编码的校验和纠错能力取决于它的海明距离。为检测出d比特错,需要使用d+1的编码;因为d个单比特错决不可能将一个有效的码字转变成另一个有效的码字。当接收方看到无效的码字,它纠能明白发生传输错误。同样,为了纠正d比特错,必须使用距离为2d+1的编码,这是因为有效码字的距离远到即使发生d个变化,这个发生了变化的码字仍然比其它码字都接近原始码字。作为纠错码的一个简单例子,考虑如下只有4个有效码字的代码: 
    0000000000、0000011111、1111100000和1111111111

          这种代码的距离为5,也就是说,它能纠正双比特错。假如码字0000000111到达后,接收方知道原始码字应该为0000011111。但是,如果出现了三位错,而将0000000000变成了0000000111,则差错将不能正确地纠正。

    2.检错码

          检错码有时也用于数据传输。例如,当信道为单工方式,无法要求重传的情况下,大多数采用检错码加重传的方式。 
    假设信道的出错是孤立的,信道的误码率为每位10-6。数据块的大小为100位。为1000位的数据块纠错,需要10个校验位;1兆的数据位将需要10000个校验位。若只需要检测一个数据块的一位错误,每块一个奇偶位就够了。每传送1000个数据块就需要额外传送一个数据块。错误检错+重传方式的整个开销,仅仅是每兆数据只有2001位,而海明码为10000位。

          假若在一个块上只加一个奇偶位,那么块的长的突发错误的检测率就会很糟糕,能够检测到差错的概率只有0.5,这是难以接受的。改进的措施可以采取将每个数据块组成n位宽k行高的长方形矩阵进行发送。对每一列的奇偶位分别进行计算,附加在矩阵上,作为矩阵的最后一行,然后按行进行发送。当块到达后,接收方检测所有的奇偶位。如果其中任何一个出错了,就需要重新传送整个块。

          这种方法能够检测到单个程度为n的突发错误,因为每一列只有一位改变了。然而如果第一位变反,最后一位变反,且所有其它位都正确,则长度为n+1的突发差错将不会被检测到。假如一个块被一个长的突发差错或者短的突发差错所破坏,n列中的每一列的奇偶值碰巧正确的概率为0.5,那么这个出错块被接受的概率不应该是2-n。

          虽然上述方法有时已经足够了,但是在实践中,另一种方法正在被广泛使用,即多项式编码(也叫循环冗余码,或CRC码)。多项式编码是基于将位串看成是系数为0或1的多项式,一个k位帧可以看成是从Xk-1到X0的k-1次多项式的系数序列。如果采用多项式编码的方式,发送方和接收方必须事先商定一个生成多项式G(x),生成多项式的高位和低位必须是1。要计算m位的帧M(x)的校验和,生成多项式必须比该多项式短。基本思想是:将校验和加在帧的末尾,使这个带校验和的帧的多项式能被G(x)除尽。当接收方收到带校验和的帧时,用G(x)去除它,如果有余数,则传输出错。 
    计算校验和的算法如下: 
    ①.设G(x)为r阶,在帧的末尾附加r个零,使帧为m+r位,则相应的多项式是XrM(x)。 
    ②.按模2除法用对应于G(x)的位串去除对应于XrM(x)的位串。 
    ③.按模2减法从对应于XrM(x)的位串中减去余数。结果就是要传送带校验和的帧,叫多项式T(x)。 
    以下三个多项式已经成为国际标准: 
    crc -12 = x^12+x^11+x^3+x^2+x+1 
    crc -16 = x^16+x^15+x^2+1 
    crc -ccitt = x^16+x^12+x^5+1

          这三个多项式都包含了x+1作为基本因子。当字符串长度为6位时,使用CRC-12;其余两个多项式用在字符串长度为8位的情况下。一个16位的校验和,如CRC-16或CRC-CCITT,可以捕捉到所有的单位差错和双位差错,所有奇数位数的差错,所有长度小于或等于16位的突发差错,99.997%的长度为17位的突发差错,以及99.998%的长度为18位或多于18位的突发差错。

          虽然计算校验和的计算方法看起来相当复杂,但Peterson和Brown已经给出了一种简单的移位寄存器电路来进行计算,并用硬件来完成对校验和的校验。在实际应用中,几乎都在使用此硬件。

    一、CRC循环冗余校验

    CRC:Cyclical Redundancy Check,循环冗余校验,简称CRC校验。 
    下面以实例对这种校验方法做个说明。 
    台达VFD-M系列变频器的Modbus RTU模式採用CRC偵誤值,CRC偵誤值以下列步驟計算: 
    步驟1:載入一個內容為FFFFH之16-bit寄存器 (稱為CRC寄存器)。 
    步驟2:將命令訊息第一個位元組與16-bit CRC寄存器的低次位元組進行Exclusive OR運算(异或运算),並將結果存回CRC 寄存器。 
    步驟3:將CRC寄存器之內容向右移1 bit,最左bit填入0,檢查CRC寄存器最低位元的值。 
    步驟4:若CRC寄存器的最低位元為0,則重覆步驟3;否則將CRC寄存器與A001H進行Exclusive OR運算。
    步驟5:重覆步驟3及步驟4,直到CRC寄存器之內容已被右移了8 bits。此時,該位元組已完成處理。 
    步驟6:對命令訊息下一個位元組重覆重覆步驟2至步驟5,直到所有位元組皆完成處理,CRC寄存器的最後內容即是CRC值。當在命令訊息中傳遞CRC值時,低位元組須與高位元組交換順序,亦即,低位元組將先被傳送。 
    例如,從地址為01H之交流電機驅動器的2102H地址讀取2個字,從ADR至資料數之最後一位元組所計算出之CRC寄存器之最後內容為F76FH,則其命令訊息如下所示,其中6FH於F7H之前傳送。 
    命令訊息 
    ADR 01H 
    CMD 03H 
    啟始資料地址 21H 
    02H 
    資料數(以word 計算) 00H 
    02H 
    CRC CHK Low 6FH 
    CRC CHK High F7H 

    下例乃以C語言產生CRC值。此函數(function)需要兩個參數:Unsigned char* data:指向訊息緩衝區(buffer)之指標;Unsigned char length:訊息緩衝區中之位元組數目;此函數將傳回unsigned integer型態之CRC值。 
    unsigned int crc_chk(unsigned char* data, unsigned char length){ 
    int j; 
    unsigned int reg_crc=0xFFFF; 
    while(length--){ 
    reg_crc ^= *data++; 
    for(j=0;j<8;j++){ 
    if(reg_crc & 0x01){ /* LSB(b0)=1 */ 
    reg_crc=(reg_crc>>1) ^ 0xA001; 
    }else{ 
    reg_crc=reg_crc >>1; 



    return reg_crc; 
    }

     

    由于计算CRC校验值比较麻烦,我们可以利用现成的软件进行计算。这样的软件有很多,例如:

     

    二、LRC纵向冗余校验

    LRC:Longitudinal Redundancy Check,纵向冗余校验,简称LRC校验或纵向校验。 
          下面以实例对这种校验方法做个说明。 
          台达VFD-M系列变频器的Modbus ASCII通信模式採用LRC偵誤值。LRC偵誤值乃是將ADR1至最後一個資料內容加總,得到之結果以十进制的256為單位,超出之部分去除(例如得到之結果為十六進位之128H則只取28H(减去了100H,就是减去了256D)),然後計算二次反補後得到之結果即為LRC偵誤值。例如:從地址為01H之交流電機驅動器的0401H地址讀取1個字。 
    STX ‘:’ 
    ADR 1 ‘0’ 
    ADR 0 ‘1’ 
    CMD 1 ‘0’ 
    CMD 0 ‘3’ 
    啟始資料地址‘0’ 
    ‘4’ 
    ‘0’ 
    ‘1’ 
    資料數 ‘0’ 
    ‘0’ 
    ‘0’ 
    ‘1’ 
    LRC CHK 1 ‘F’ 
    LRC CHK 0 ‘6’ 
    END 1 CR 
    END 0 LF 
    01H+03H+04H+01H+00H+01H=0AH, 0AH的二次反補為F6H。 

    二次反补:取反然后加1B或1H(1B=1H)。 
    计算方法1: 
    取反后加1B:把数据转换为二进制,每位取反后再加1B。例如:0AH=00001010B,按位取反后得11110101B,11110101B+1B=11110110B=F6H,0AH的二次反补就是F6H。 
    取反后加1H:把数据转换为二进制,每位取反后再加1H。例如:0AH=00001010B,按位取反后得11110101B=F5H,F5H+1H=F6H,0AH的二次反补就是F6H。 

    计算方法2: 
    有个简单算法就是:这个十六进制值有几位数,就把高于这个位数的最小值减去这个值。如果16进制数有2位,那么高于2位的最小值就是100H,用100H减去这个数就是其二次反补。 
          实际上,该方法的原理和方法1相同:以2位16进制数为例,FFH减去那个数就是把那个数取反(FFH的数据为全1,减去那个数的结果就是原来1的位数变为0,原来0的位数变为1),而FFH+1H=100H。所以取反然后加一就等于100H减去这个数。 
          例如:0AH的二次反补就是:100H-0AH=F6H

    三、PC奇偶效验

          奇偶校验:Parity Check,是检测数据完整性的一种方法,一种冗余校验。通过该校验将重新计算的奇偶校验位与预先给出的奇偶校验位进行比较,测试二进制数字阵列中数字1(或0)的数目是奇数还是偶数的一种检查。这种校验设置一个奇偶校验位,即奇数(对奇校验)或偶数(对偶检验),对数据中(除了校验位)的全部二进制1或0的数目进行校验。

          奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。

    四、SC累加和校验

          SUM Check,简称SC。也有简称SC校验的,即Check SUM,校验和。 
          帧校验和为启动字符至校验和前的数据单字节算术累加和的低字节。 
          深圳传动之星变频器通信协议就采用了累加和校验。

    五、S-XOR加总异或校验

    SUM XOR Check,加总异或校验,也称之为异或校验和、累加异或校验和。在理解加总异或校验之前,我们先来了解一下什么是异或运算。

    异或运算:参与运算的两个数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

    异或的运算方法是一个二进制运算: 
    1^1=0 
    0^0=0 
    1^0=1 
    0^1=1 
    两者相等为0,不等为1. 

    这样我们发现交换两个整数的值时可以不用第三个参数。 
    如a=11,b=9.以下是二进制 
    a=a^b=1011^1001=0010; 
    b=b^a=1001^0010=1011; 
    a=a^b=0010^1011=1001; 
    这样一来a=9,b=13了。

    0 xor 0 = 0 
    1 xor 1 = 0 
    0 xor 1 = 1 
    1 xor 0 = 1

    按位运算,不同的位置1,相同的位置0 
    比如:69h xor 5Ah = 33h 

    69h = 01101001b 
    5Ah = 01011010b 
    ――――――――――― 
    33h = 00110011b

    说清楚点就是 二进制数按位运算时当对应的两位的值相同时(既都为1或0)那么该位xor的结果就是1,否则就为0,也就是相异则为1,否则为0。 
    比如01101001异或01011010结果为00110011 
    69h = 01101001b 
    5Ah = 01011010b 
    ――――――――――― 
    33h = 00110011b

    采用Windows自带计算器进行异或运算: 
    打开Windows自带的计算器,点击“查看”——“科学型”,选择“十六进制”,再输入“操作数1”、“Xor”、“操作数2”、“=”,就得出结果了@_@

    加总异或有什么用呢?现在,很多设备的通信协议都采用了加总异或校验而不是累加和校验。例如丹麦丹佛斯Danfoss的变频器、其成员单位海利普的变频器都采用了加总异或校验。

    言归正传,下面我们来看看怎么对下面的数据进行加总异或:

    02 06 01 04 7C 40 00

    计算 02 06 01 04 7C 40 00? 的加总异或值有以下几种方法:

    1、采用Windows自带计算器进行异或运算:先计算02与06的异或值,然后把结果再和01异或。。。。。。一共进行6次异或计算,得到结果3D

    2、采用现成的软件进行计算:例如大傻串口调试软件V4.5等软件,一次性就可以计算出来。

    对于手工计算,有2种计算方法:1、 逐个字节异或;2、 把所有的字节先求和,再异或。下面的方法3和方法4就是这两种方法的体现。

    3、手工计算:和方法1原理一样,只不过方法1是计算器,该方法是手工计算:

    4、手工计算:和方法3原理一样,只不过方法3是一个一个计算,该方法是一起计算:

    上速算法中,纵列相加,有奇数个1结果就等于1,有偶数个1结果就等于0。
    原理如下:异或运算是相同为0,不同为1;那么有多少个0都是0,所以可以不管零;那么有1个1,结果肯定为1;有2个1,结果就为0;有3个1,结果就为1。。。。。。

    下面是《丹佛斯变频器VLT5000 RS485协议手册》(英文)中第15页对该计算方法的描述:

    展开全文
  • 一些常用校验算法

    2019-10-01 23:39:13
    1 /****************************************************** 2 *函数名称:CheckSumSum16 ... 3 *输 入:buf 要校验的数据 4 len 校验数据的长 5 *输 出:校验和 6 *功 能:校验和-16 7 *******************...
      1 /******************************************************
      2 *函数名称:CheckSumSum16
      3 *输   入:buf 要校验的数据
      4         len 校验数据的长
      5 *输   出:校验和
      6 *功   能:校验和-16
      7 *******************************************************/
      8 uint16_t CheckSum16(uint8_t *buf,uint32_t len)
      9 {
     10   uint32_t i=0;
     11   uint32_t Sum=0;
     12   uint16_t CheckSum=0;
     13 
     14     for (i=0;i<len;i++)
     15     {
     16         Sum+=*buf++;
     17     }
     18     CheckSum = (Sum >>16) + (Sum & 0xffff);
     19     return CheckSum;
     20 }
     21 
     22 /******************************************************
     23 *函数名称:BCCVerify
     24 *输   入:buf 要校验的数据
     25         len 校验数据的长
     26 *输   出:校验值
     27 *功   能:异或校验
     28 *******************************************************/
     29 uint8_t BCCVerify(uint8_t *buf,uint32_t len)
     30 {
     31   uint8_t s = 0;
     32   uint32_t i = 0;
     33 
     34     for(i=0;i<len;i++)
     35     {
     36         s = s^(*(buf+i));
     37     }
     38 
     39     return s;
     40 }
     41 
     42 /******************************************************
     43 *函数名称:DataBCCVerify
     44 *输   入:data 异或校验值
     45         buf 要校验的数据
     46         len 校验数据的长
     47 *输   出:校验值
     48 *功   能:异或校验
     49 *******************************************************/
     50 uint8_t DataBCCVerify(uint8_t data,uint8_t *buf,uint32_t len)
     51 {
     52   uint8_t s = 0;
     53   uint32_t i = 0;
     54   
     55   s = data;
     56 
     57     for(i=0;i<len;i++)
     58     {
     59         s = s^(*(buf+i));
     60     }
     61 
     62     return s;
     63 }
     64 
     65 
     66 // 注意:因最高位一定为“1”,故略去
     67 const unsigned short cnCRC_16 = 0x8005;
     68 // CRC-16 = X16 + X15 + X2 + X0
     69 const unsigned short cnCRC_CCITT = 0x1021;
     70 // CRC-CCITT = X16 + X12 + X5 + X0,据说这个 16 位 CRC 多项式比上一个要好
     71 const unsigned long cnCRC_32 = 0x04C10DB7;
     72 // CRC-32 = X32 + X26 + X23 + X22 + X16 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + X0
     73 
     74 /******************************************************
     75 *函数名称:BuildTable16
     76 *输   入:aPoly  多项式    取值【0x8005, 0x1021 】
     77 *功   能:根据多项式,生成查找表
     78          (美国标准-0x8005)(CCITT-0x1021)
     79 *******************************************************/
     80 void BuildTable16( unsigned short aPoly )
     81 {
     82   unsigned short i, j;
     83   unsigned short nData;
     84   unsigned short nAccum;
     85   unsigned long Table_CRC[256]; // CRC 表
     86   
     87   for ( i = 0; i < 256; i++ )
     88   {
     89     nData = ( unsigned short )( i << 8 );
     90     nAccum = 0;
     91     for ( j = 0; j < 8; j++ )
     92     {
     93       if ( ( nData ^ nAccum ) & 0x8000 )
     94       nAccum = ( nAccum << 1 ) ^ aPoly;
     95       else
     96       nAccum <<= 1;
     97       nData <<= 1;
     98     }
     99     Table_CRC[i] = ( unsigned long )nAccum;
    100   }
    101   
    102   for(int i=0;i<256;i++)
    103        printf("0x%04x, ",Table_CRC[i]);
    104 }
    105 
    106 /*CRC-16/IBM: 多项式:X16+X15+X2+1, 生成码为 0x8005.*/
    107 const unsigned short CRC16Table[256] = {
    108 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, 0x8033, 0x0036, 
    109 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, 0x8063, 0x0066, 0x006c, 0x8069, 
    110 0x0078, 0x807d, 0x8077, 0x0072, 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 
    111 0x0044, 0x8041, 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, 
    112 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, 0x00a0, 0x80a5, 
    113 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, 0x8093, 0x0096, 0x009c, 0x8099, 
    114 0x0088, 0x808d, 0x8087, 0x0082, 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 
    115 0x8197, 0x0192, 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, 
    116 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, 0x81d3, 0x01d6, 
    117 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, 0x0140, 0x8145, 0x814f, 0x014a, 
    118 0x815b, 0x015e, 0x0154, 0x8151, 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 
    119 0x8167, 0x0162, 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, 
    120 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, 0x8303, 0x0306, 
    121 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, 0x0330, 0x8335, 0x833f, 0x033a, 
    122 0x832b, 0x032e, 0x0324, 0x8321, 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 
    123 0x0374, 0x8371, 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, 
    124 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, 0x83f3, 0x03f6, 
    125 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, 0x83a3, 0x03a6, 0x03ac, 0x83a9, 
    126 0x03b8, 0x83bd, 0x83b7, 0x03b2, 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 
    127 0x0384, 0x8381, 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, 
    128 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, 0x82e3, 0x02e6, 
    129 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, 0x02d0, 0x82d5, 0x82df, 0x02da, 
    130 0x82cb, 0x02ce, 0x02c4, 0x82c1, 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 
    131 0x8257, 0x0252, 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, 
    132 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, 0x8213, 0x0216, 
    133 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
    134 };
    135 
    136 /*CRC16-CCITT, 多项式: X16+X12+X5+1, 生成码为 0x1021.*/
    137 const unsigned short CRC16Table_CCITT[256] = {                    /* CRC余式表 */   
    138     0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,   
    139     0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,   
    140     0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,   
    141     0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,   
    142     0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,   
    143     0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,   
    144     0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,   
    145     0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,   
    146     0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,   
    147     0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,   
    148     0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,   
    149     0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,   
    150     0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,   
    151     0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,   
    152     0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,   
    153     0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,   
    154     0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,   
    155     0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,   
    156     0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,   
    157     0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,   
    158     0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,   
    159     0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,   
    160     0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,   
    161     0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,   
    162     0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,   
    163     0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,   
    164     0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,   
    165     0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,   
    166     0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,   
    167     0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,   
    168     0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,   
    169     0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0   
    170 }; 
    171 
    172 /******************************************************
    173 *函数名称:CRC16_TABLE
    174 *输   入:pszBuf  要校验的数据
    175         unLength 校验数据的长
    176 *输   出:校验值 【已验证】
    177 *功   能:查表法计算CRC16
    178          (美国标准-0x8005)
    179 *******************************************************/
    180 unsigned short CRC16_TABLE( unsigned char * aData, unsigned long aSize )
    181 {
    182   unsigned long i;
    183   unsigned short nAccum = 0;
    184   
    185   for ( i = 0; i < aSize; i++ )
    186     nAccum = ( nAccum << 8 ) ^ ( unsigned short )CRC16Table[( nAccum >> 8 ) ^ *aData++];
    187   return nAccum;
    188 }
    189 
    190 
    191 /******************************************************************************* 
    192 *函数名称: CRC16_BIT
    193 * 功能描述: 按bit计算CRC16.(美国标准-0x8005) 【已验证】
    194 * 输入参数: addr -- 待校验数据
    195 *          num -- 数据长度
    196 * 返 回 值: 校验值
    197 *******************************************************************************/
    198 unsigned short CRC16_BIT(unsigned char *addr, unsigned int num)  
    199 {  
    200     int i;  
    201     unsigned short POLY = 0x8005;
    202     unsigned short crc = 0;
    203     
    204     for (; num > 0; num--)              /* Step through bytes in memory */  
    205     {  
    206         crc = crc ^ (*addr++ << 8);     /* Fetch byte from memory, XOR into CRC top byte*/  
    207         for (i = 0; i < 8; i++)             /* Prepare to rotate 8 bits */  
    208         {  
    209             if (crc & 0x8000)            /* b15 is set... */  
    210                 crc = (crc << 1) ^ POLY;    /* rotate and XOR with polynomic */  
    211             else                          /* b15 is clear... */  
    212                 crc <<= 1;                  /* just rotate */  
    213         }                             /* Loop for 8 bits */  
    214         crc &= 0xFFFF;                  /* Ensure CRC remains 16-bit value */  
    215     }                               /* Loop until num=0 */  
    216     return(crc);                    /* Return updated CRC */  
    217 }  
    218 
    219 
    220 
    221 /******************************************************
    222 *函数名称:CRC16_CCITT_TABLE
    223 *输   入:pszBuf  要校验的数据
    224         unLength 校验数据的长
    225 *输   出:校验值
    226 *功   能:循环冗余校验-16  【已验证】
    227          (CCITT标准-0x1021)
    228 *******************************************************/
    229 unsigned short CRC16_CCITT_TABLE( unsigned char * aData, unsigned long aSize )
    230 {
    231   unsigned long i;
    232   unsigned short nAccum = 0;
    233   
    234   for ( i = 0; i < aSize; i++ )
    235     nAccum = ( nAccum << 8 ) ^ ( unsigned short )CRC16Table_CCITT[( nAccum >> 8 ) ^ *aData++];
    236   return nAccum;
    237 }
    238 /******************************************************************************* 
    239 *函数名称: CRC16_CCITT_BIT
    240 * 功能描述: 按bit计算CRC16-CCITT.(CCITT-0x1021)【已验证】
    241 * 输入参数: dataIn -- 待校验数据
    242 *          length -- 数据长度
    243 * 返 回 值: 校验值
    244 *******************************************************************************/
    245 unsigned short CRC16_CCITT_BIT(unsigned char *addr, unsigned int num)  
    246 {  
    247     int i;  
    248     unsigned short POLY = 0x1021;
    249     unsigned short crc = 0;
    250     
    251     for (; num > 0; num--)              /* Step through bytes in memory */  
    252     {  
    253         crc = crc ^ (*addr++ << 8);     /* Fetch byte from memory, XOR into CRC top byte*/  
    254         for (i = 0; i < 8; i++)             /* Prepare to rotate 8 bits */  
    255         {  
    256             if (crc & 0x8000)            /* b15 is set... */  
    257                 crc = (crc << 1) ^ POLY;    /* rotate and XOR with polynomic */  
    258             else                          /* b15 is clear... */  
    259                 crc <<= 1;                  /* just rotate */  
    260         }                             /* Loop for 8 bits */  
    261         crc &= 0xFFFF;                  /* Ensure CRC remains 16-bit value */  
    262     }                               /* Loop until num=0 */  
    263     return(crc);                    /* Return updated CRC */  
    264 }  
    265 
    266 
    267 /* CRC32 查找表 */
    268 uint32 Crc32Table[256]=
    269 {
    270         0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
    271         0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD,
    272         0x4C11DB70,0x48D0C6C7,0x4593E01E,0x4152FDA9,0x5F15ADAC,0x5BD4B01B,0x569796C2,0x52568B75,
    273         0x6A1936C8,0x6ED82B7F,0x639B0DA6,0x675A1011,0x791D4014,0x7DDC5DA3,0x709F7B7A,0x745E66CD,
    274         0x9823B6E0,0x9CE2AB57,0x91A18D8E,0x95609039,0x8B27C03C,0x8FE6DD8B,0x82A5FB52,0x8664E6E5,
    275         0xBE2B5B58,0xBAEA46EF,0xB7A96036,0xB3687D81,0xAD2F2D84,0xA9EE3033,0xA4AD16EA,0xA06C0B5D,
    276         0xD4326D90,0xD0F37027,0xDDB056FE,0xD9714B49,0xC7361B4C,0xC3F706FB,0xCEB42022,0xCA753D95,
    277         0xF23A8028,0xF6FB9D9F,0xFBB8BB46,0xFF79A6F1,0xE13EF6F4,0xE5FFEB43,0xE8BCCD9A,0xEC7DD02D,
    278         0x34867077,0x30476DC0,0x3D044B19,0x39C556AE,0x278206AB,0x23431B1C,0x2E003DC5,0x2AC12072,
    279         0x128E9DCF,0x164F8078,0x1B0CA6A1,0x1FCDBB16,0x018AEB13,0x054BF6A4,0x0808D07D,0x0CC9CDCA,
    280         0x7897AB07,0x7C56B6B0,0x71159069,0x75D48DDE,0x6B93DDDB,0x6F52C06C,0x6211E6B5,0x66D0FB02,
    281         0x5E9F46BF,0x5A5E5B08,0x571D7DD1,0x53DC6066,0x4D9B3063,0x495A2DD4,0x44190B0D,0x40D816BA,
    282         0xACA5C697,0xA864DB20,0xA527FDF9,0xA1E6E04E,0xBFA1B04B,0xBB60ADFC,0xB6238B25,0xB2E29692,
    283         0x8AAD2B2F,0x8E6C3698,0x832F1041,0x87EE0DF6,0x99A95DF3,0x9D684044,0x902B669D,0x94EA7B2A,
    284         0xE0B41DE7,0xE4750050,0xE9362689,0xEDF73B3E,0xF3B06B3B,0xF771768C,0xFA325055,0xFEF34DE2,
    285         0xC6BCF05F,0xC27DEDE8,0xCF3ECB31,0xCBFFD686,0xD5B88683,0xD1799B34,0xDC3ABDED,0xD8FBA05A,
    286         0x690CE0EE,0x6DCDFD59,0x608EDB80,0x644FC637,0x7A089632,0x7EC98B85,0x738AAD5C,0x774BB0EB,
    287         0x4F040D56,0x4BC510E1,0x46863638,0x42472B8F,0x5C007B8A,0x58C1663D,0x558240E4,0x51435D53,
    288         0x251D3B9E,0x21DC2629,0x2C9F00F0,0x285E1D47,0x36194D42,0x32D850F5,0x3F9B762C,0x3B5A6B9B,
    289         0x0315D626,0x07D4CB91,0x0A97ED48,0x0E56F0FF,0x1011A0FA,0x14D0BD4D,0x19939B94,0x1D528623,
    290         0xF12F560E,0xF5EE4BB9,0xF8AD6D60,0xFC6C70D7,0xE22B20D2,0xE6EA3D65,0xEBA91BBC,0xEF68060B,
    291         0xD727BBB6,0xD3E6A601,0xDEA580D8,0xDA649D6F,0xC423CD6A,0xC0E2D0DD,0xCDA1F604,0xC960EBB3,
    292         0xBD3E8D7E,0xB9FF90C9,0xB4BCB610,0xB07DABA7,0xAE3AFBA2,0xAAFBE615,0xA7B8C0CC,0xA379DD7B,
    293         0x9B3660C6,0x9FF77D71,0x92B45BA8,0x9675461F,0x8832161A,0x8CF30BAD,0x81B02D74,0x857130C3,
    294         0x5D8A9099,0x594B8D2E,0x5408ABF7,0x50C9B640,0x4E8EE645,0x4A4FFBF2,0x470CDD2B,0x43CDC09C,
    295         0x7B827D21,0x7F436096,0x7200464F,0x76C15BF8,0x68860BFD,0x6C47164A,0x61043093,0x65C52D24,
    296         0x119B4BE9,0x155A565E,0x18197087,0x1CD86D30,0x029F3D35,0x065E2082,0x0B1D065B,0x0FDC1BEC,
    297         0x3793A651,0x3352BBE6,0x3E119D3F,0x3AD08088,0x2497D08D,0x2056CD3A,0x2D15EBE3,0x29D4F654,
    298         0xC5A92679,0xC1683BCE,0xCC2B1D17,0xC8EA00A0,0xD6AD50A5,0xD26C4D12,0xDF2F6BCB,0xDBEE767C,
    299         0xE3A1CBC1,0xE760D676,0xEA23F0AF,0xEEE2ED18,0xF0A5BD1D,0xF464A0AA,0xF9278673,0xFDE69BC4,
    300         0x89B8FD09,0x8D79E0BE,0x803AC667,0x84FBDBD0,0x9ABC8BD5,0x9E7D9662,0x933EB0BB,0x97FFAD0C,
    301         0xAFB010B1,0xAB710D06,0xA6322BDF,0xA2F33668,0xBCB4666D,0xB8757BDA,0xB5365D03,0xB1F740B4
    302 };
    303 
    304 /* 查表法计算 CRC32 / 经验证和STM32硬件CRC计算结果一致  */
    305 uint32 CRC32Software(uint8 *pData,uint16 Length)
    306 {
    307        
    308         uint32 nReg;//CRC寄存器
    309         uint32 nTemp=0;
    310         uint16 i, n;
    311 
    312         nReg = 0xFFFFFFFF;//
    313         for(n=0; n<Length; n++)
    314         {
    315                 nReg ^= (uint32)pData[n];
    316                
    317                 for(i=0; i<4; i++)
    318                 {
    319                         nTemp = Crc32Table[(uint8)(( nReg >> 24 ) & 0xff)]; //取一个字节,查表
    320                         nReg <<= 8;                        //丢掉计算过的头一个BYTE
    321                         nReg ^= nTemp;                //与前一个BYTE的计算结果异或
    322                 }
    323         }
    324         return nReg;
    325 }
    326 /* STM32 的 CRC */
    327 uint32 CRC32(uint8 *pBuf, uint16 nSize)
    328 {
    329         uint32 index = 0;
    330         CRC_ResetDR();        //复位CRC       
    331         for(index = 0; index < nSize; index++)
    332         {
    333                 CRC->DR = (uint32)pBuf[index];
    334         }
    335         return (CRC->DR);
    336 }
    View Code

     

    转载于:https://www.cnblogs.com/emlslxl/p/5643365.html

    展开全文
  • 常用校验算法(累加和、异或和)

    万次阅读 2019-11-19 14:09:43
    1、异或和 ... 下面是校验实例 local rdbuf = "FFFF28000000000000600001000D0000000000000000000000000000000000000000000000000000000096" local fast = string.sub(rdbuf, 5, string.len(rd...

    1、异或和

      异或和就是对数据逐一异或计算(异或结果与下一个数据异或)

      下面是校验实例

    local rdbuf = "FFFF28000000000000600001000D0000000000000000000000000000000000000000000000000000000096" local fast = string.sub(rdbuf, 5, string.len(rdbuf)-2) local last = string.sub(rdbuf, string.len(rdbuf)-1, string.len(rdbuf)) local num = bit.bxor(tonumber(string.sub(fast, 1, 2), 16), tonumber(string.sub(fast, 3, 4), 16)) --异或 local length = string.len(fast) - 1 for i = 5, length, 2 do num = bit.bxor(num, tonumber(string.sub(fast, i, i+1), 16)) end if num == tonumber(last, 16) then 校验成功 end

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	char text[100];
    	int i,j,key;
    	printf("输入明文:");
        for(i=0; i<100; i++){
            text[i] = getchar();
            if(text[i] == '\n'){
                text[i] = '\0';
                break;
            }
        }
        printf("输入密钥:");
        scanf("%d",&key);
        printf("加密:");
        for(j=0;j<i;j++){
            text[j] = text[j] ^ key;
        }
        puts(text);
        printf("解密:");
        for(j=0;j<i;j++){
            text[j] = text[j] ^ key;
        }
        puts(text);
        return 0;
    }

     

     

    2、累加和

      累加和也是逐一累加,但是计算不进位,所以最终结果其实是累加结果求256的余数

      下面是计算实例

    local cmd = 10
    cmd = string.format("%02X",cmd) -- 02X 是为了保留两位,空位置0   例如(A是0A)
    local fast = "18000000000000600001000200".. cmd .."00000000000000010006"
    local length = #fast - 1  
    local num = 0
    for i = 1, length, 2 do
        num = num + tonumber(string.sub(fast, i, i+1), 16)  
    end 
    num = num % 256
    num = string.format("%02X",num)
    local instruction = "FFFF" .. fast .. num
    
    print(instruction)

    转载链接

    展开全文
  • 为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验和循环冗余码校验就是其中最常用校验算法。串行数据在传输过程中,由于干扰可能引起信息的错误,出现“误码”。我们把如何发现传输中的...

    本篇博客主要记载了我对数据校验过程以及奇偶校验的理解。

    1.数据校验过程

    由于数据传输距离的因素影响,计算机和受控设备间的通信数据就常常出现不可预知的错误。为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验和循环冗余码校验就是其中最常用的校验算法。串行数据在传输过程中,由于干扰可能引起信息的错误,出现“误码”。我们把如何发现传输中的错误,叫“检码”;发现错误后,如何进行修订,叫“检错”。
    之前,就有过提示,为了保证数据在传输过程中不会出错,每个数据包后面一般都会加上校验字节。


    校验过程是发送端(TX端)和接收端(RX端)共同完成的过程。如上图所示,首先,TX端按照用户层协议(数据包格式)将数据根据校验算法计算出TX校验字节,并将TX校验字节按照协议放在数据包的指定位置。RX端接收到数据包后,在指定位置取出TX校验字节,同时,再将接收到的数据按规定方式计算出RX校验字节,如果RX校验字节与接收到的TX校验字节相等,则说明数据包是有效的,否则就应该放弃该数据包。

    2.简单粗暴地奇偶校验

    最简单粗暴的方法就是“奇偶校验”了,即在传输字符的各位之外,再传送一位奇/偶校验位。可采用的策略分为奇校验和偶校验。

    2.1 奇校验

    所有传送的位数(含字符的个数位和校验位)中,“1”的个数为奇数,如1 0110,0101;0 0110,0001

    2.2 偶校验

    所有传送的位数(含字符的各位数和检验位)中,“1”的个数为偶数,如1 0100,0101;0 0100,0001
    奇偶校验能够检测出信息传输过程中的部分错误的数据(一位错误的代码能够检出,两位及以上的错误代码不能检出)。奇偶检验有一个劣势,就是他只能发现错误,而不能纠正错误;一旦发现错误,那么没办法,只能重发。但是由于奇偶校验使用起来非常简单,仍然被广泛使用。但是仍存在一些良好的矫正错误数据的方法,并具有自动訆错能力,如循环冗余码(CRC)检错等。

    3.异或校验

    异或校验方法也是非常简单,而且非常通用,虽然使用该方法校验后仍存在出错的可能,但是因为异或算法非常简单,编程毫不费力,一般新手都用这种方法。
    之前介绍过的NMEA-0183无线通信协议是在异或算法基础之上进行了一定的改进。能够理解异或运算,并使用好异或校验算法,会使得数据处理编程变得轻松容易。

    4.CRC循环冗余码校验

    循环冗余码校验(Cyclical Redundancy Check, CRC)是利用除法和余数的原理来做错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置RX,RX对收到的数据重新计算CR并与收到的CRC值相比较,若两个CRC值不同,则说明数据通信出现了错误,该数据包应该舍弃不用。
    在远距离数据通讯中,为确保高效而无差错的传送数据,必须对数据进行校验控制,而CRC是对一个传送数据块进行校验,是一种非常高效的差错控制方法。目前,主流的CRC可以分为以下几个标准:CRC-12码;CRC-16码;CRC-CCITT码;CRC-32码。
    CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码用途有限。
    在数据存储和数据通信领域,CRC无处不在:著名的通信协议X.25的FCS(帧检错序列)采用的是CRC/CCITT,ARJ/LHA等压缩工具软件采用的是CRC32,磁盘驱动器读写采用的日式CRC16,通常用到的图像存储格式GIF/TIFF等也是采用CRC作为检错手段的。

    4.1 CRC-16的生成过程

    CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高位向低位进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移除CRC寄存器)如果是1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,就无需进行进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个8-bit数据似的8次移位。所有的字符处理完成后CRC寄存器的值即为最终的CRC值。
    下面为CRC的计算过程:
    (1)设置CRC寄存器,并给其赋值FFFF(hex);
    (2)将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器;
    (3)CRC寄存器向右移一位,MSB补零,移出并检查LSB;
    (4)如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或;
    (5)重复第3与第4步直到8次移位全部完成。此时,一个8-bit数据处理完毕;
    (6)重复第2至第5步直到所有数据全部处理完成;
    (7)最终CRC寄存器的内容即为CRC值。

    4.2 如何理解CRC码?

    CRC校验是一种多项式除法:将需要发送的数据包当做一个很大的二进制数,用它来除以一个固定的二进制数,所得到的余数即是所求得的CRC校验码。
    展开全文
  • 点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记!来源 | 网络1、数据校验过程 由于数据传输距离的因素影响,计算机和受控设备间的通信数据就常常出现不可预知的错误。为了防...
  • 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列...
  • 1.数据校验过程 ...为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验和循环冗余码校验就是其中最常用校验算法。串行数据在传输过程中,由于干扰可能引起信息的错
  • 校验算法

    2018-08-12 17:48:00
    # 校验算法 ### 常见的校验算法------------------------------ LRC- BCC- CRC ### LRC------------------------------ 简介 - 纵向冗余校验(Longitudinal Redundancy Check,简称:LRC)是通信中常用的一种校验...
  • crypt-md5源代码,这是linux里面最常用密码校验算法,利用salt和password和crypt函数生成hash值,原理就是用数次md5函数
  • 数据校验常用算法

    千次阅读 2013-07-10 09:30:16
    【电脑】总和检验码,校验总和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。 它通常是以十六进制为数制表示的形式,如: ...
  • CRC8/16/32/XOR/LRC 校验算法生成工具

    热门讨论 2015-04-01 14:51:31
    比较齐全的校验码生成工具,支持16进制和ASCII码输入,支持字节大小端顺序,支持以下常用校验算法: CRC-8 (正序) CRC-8 (逆序) CRC-16 (0xA001) CRC-16 (0x8005) CRC-16 (Modbus) CRC-CCITT (XModem) CRC-CCITT ...
  • 内容介绍Java里的常用算法的使用,包含转换Hex/Base64等数据转换算法,CRC32/MD5/HMAC-SHA1数据签名和校验算法,DES/AES等对称加密算法。 由于篇幅的限制,本文只对各种算法的使用给出代码示例。如果对原...
  • 素材来源:网络编辑整理:strongerHuangUART有一个奇偶校验,CAN通信有CRC校验。...一、校验和校验和是最基本,也是嵌入式工程师最常用的一种校验算法,其实现方法很简单,简单到只有几行代码。实现的...
  • CRC校验算法

    千次阅读 2017-03-02 18:11:35
    基本原理及概念CRC校验算法是在通信方面常用的一种差错检测的手段。原理是在将原始帧数据发送之前,在n个bit位的原始数据后面再加上通过特定运算得到的k位校验序列,组成新的帧再发送给接受端。接受端会根据原始数据...
  • CRC16 校验算法

    万次阅读 2019-08-15 15:56:13
    是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 2、生成CRC码的基本原理: 任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。...
  • 通过对两种常用CRC校验算法的研究分析,为TD-LTE测试仪表系统选择了一种最优的CRC校验算法,并在TMS320C64xDSP中实现。将CRC校验程序在CCS3.3中运行,其结果验证了算法的可行性、高效性。
  • C#校验算法列举

    2017-10-26 10:18:00
    以下是工作中常用的几种校验算法,后期将不断更新和校验 /// <summary> /// CS和校验 /// </summary> /// <param name="bytesToCalc">要进行CS和校验的byte数组.</param> /// <...
  • 通用型CRC校验算法

    2020-05-02 14:24:33
    通用型CRC校验算法 1、CRC校验简单原理 CRC校验方法是在通讯领域应用极广的一类数据校验方法,常用的包括CRC8、CRC16、CRC32(数字为生成多项式Gx-1),在嵌入式领域应用较多(DS18B20温度传感器正负温度精度校验...
  • CRC校验算法

    千次阅读 2012-12-02 00:36:18
    CRC校验算法  CRC(Cyclic Redundancy Check)循环冗余校验是常用的数据校验方法, 讲CRC算法的文章很多,之所以还要写这篇, 是想换一个方法介绍CRC算法,希望能让大家更容易理解CRC算法。  先说说什么是数据...
  • 16位CRC校验算法

    千次阅读 2018-01-18 18:46:21
    CRC校验比较常用,本例校验算法异或0x1021. U16 u16CRCVerify (const U8 *pu8Data, U32 u32Len, U16 u16CRCInit) { U8 u8i; U32 u16CRC = u16CRCInit;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 591
精华内容 236
关键字:

常用校验算法