zoukankan      html  css  js  c++  java
  • CRC冗余校验码的介绍和实现

    from:http://yoyo.play175.com/p/200.html

    节选至百度百科:

    首先,任何一个由二进制数位串组成的代码,都可以惟一地与一个只含有0和1两个系数的多项式建立一一对应的关系。例如,代码1010111对应的多项式为X^6+X^4+X^2+X+1(这里的X^n表示x的n次方)。同样.多项式X^5+X^3+X^2+X+1对应的代码为101111。CRC码在发送端编码和接收端校验时,都可以利用事先约定的生成多项式G(X)来得到。目前广泛使用的生成多项式主要有以下四种:
    CRC12=X^12+X^11+X^3+X^2+1
    CRC16=X^16+X^15+X^2+1(IBM公司)
    CRC16=X^16+X^12+X^5+1(国际电报电话咨询委员会CCITT)
    CRC32=X^32+X^26+X^23+X^22+X^16+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X+1
    冗余码的计算方法是,先将信息码后面补0,补0的个数是生成多项式最高次幂;将补零之后的信息码用模二除法(非二进制除法)除以G(X)对应的2进制码,注意除法过程中所用的减法是模2减法,即没有借位的减法,也就是异或运算。当被除数逐位除完时,得到比除数少一位的余数。此余数即为冗余位,将其添加在信息位后便构成CRC码字。
    例如,假设信息码字为11100011,生成多项式G(X)=X^5+X^4+X+1,计算CRC码字。
    G(X) = X^5+X^4+X+1,也就是110011,因为最高次是5,所以,在信息码字后补5个0,变为1110001100000。用1110001100000模二除法除以110011,余数为11010,即为所求的冗余位。
    因此发送出去的CRC码字为原始码字11100011末尾加上冗余位11010,即 1110001111010。接收端收到码字后,采用同样的方法验证,即将收到的码字用模二除法除以110011(是G(X)对应的二进制生成码),发现余数是0,则认为码字在传输过程中没有出错。

    附获得CRC32的C代码:

    1. unsigned long getCRC32( unsigned char* pBuf,unsigned long len) 
    2.     static unsigned long crcTable[256]; 
    3.     static unsigned char isInit; 
    4.     unsigned long poly; 
    5.     int i, j; 
    6.  
    7.     register unsigned long crc; 
    8.  
    9.     if(isInit==0) 
    10.     { 
    11.         isInit = 1; 
    12.         poly = 0xEDB88320L; 
    13.         for (i=0; i<256; i++) { 
    14.             crc = i; 
    15.             for (j=8; j>0; j--) { 
    16.                 if (crc&1) { 
    17.                     crc = (crc >> 1) ^ poly; 
    18.                 } else { 
    19.                     crc >>= 1; 
    20.                 } 
    21.             } 
    22.             crcTable[i] = crc; 
    23.         } 
    24.     } 
    25.  
    26.     int c; 
    27.     crc = 0xFFFFFFFF; 
    28.     i=0; 
    29.     while(len--) { 
    30.         c = pBuf[i]; 
    31.         i++; 
    32.         crc = ((crc>>8) & 0x00FFFFFF) ^ crcTable[ (crc^c) & 0xFF ]; 
    33.     } 
    34.     return( crc^0xFFFFFFFF ); 
  • 相关阅读:
    【PowerOJ1754&网络流24题】负载平衡问题(费用流)
    【PowerOJ1753&网络流24题】分配问题(KM)
    【PowerOJ1752&网络流24题】运输问题(费用流)
    【PowerOJ1751&网络流24题】数字梯形问题(费用流)
    【PowerOJ1746&网络流24题】航空路线问题(费用流)
    【PowerOJ1744&网络流24题】方格取数问题(最小割)
    【PowerOJ1742&网络流24题】试题库问题(最大流)
    【PowerOJ1741&网络流24题】最长递增子序列问题(最大流)
    【PowerOJ1739&网络流24题】魔术球问题(最大流)
    邮件系统相关协议之SMTP
  • 原文地址:https://www.cnblogs.com/94cool/p/3240792.html
Copyright © 2011-2022 走看看