二つのCRC-16検査の方法

6950 ワード

転載元:http://www.51hei.com/bbs/dpj-51955-1.html  検表法
https://zhidao.baidu.com/question/463053928.html  計算法
二つのCRC検査方法:チェックシート法と計算法.
16ビットCRCの多項式0 x 8005
表法を調べます.もうすぐ256種類が全部リストされます.表から検索します.
  特徴:速度が速く、文が少ないですが、表は一定のプログラム空間を占めています.
*pucFrameはチェックされているデータのヘッダアドレスで、usLenはチェックされているデータの長さです.値を検証結果として返します.
USHORT usMBCRC 16(UCHAR*pucFrame、USHORT usLen)
{
    UCHAR ucCRCHi=0 xFF;
    UCHAR ucCRCLo=0 xFF;
    int iIndex
    while(usLen-)
    {
        iIndex=ucCRCLo^*(pucFrame+);
        ucCRCLo=(UCHAR)(ucCRCHi^aucCRCHi[iIndex])
        ucCRCHi=aucCRCLo[iIndex]
    }
    return(USHORT)(ucCRCHi<<8|ucCRCLo);
)
static const UCHAR aucCRCHi[]={
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 00、0 x C 1、0 x 81、0 x 40、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 00、0 x C 1、0 x 81、0 x 40、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 00、0 x C 1、0 x 81、0 x 40、
    0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 00、0 x C 1、0 x 81、0 x 40、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 00、0 x C 1、0 x 81、0 x 40、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、
    0 x 01、0 x C 0、0 x 80、0 x 41、0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 00、0 x C 1、0 x 81、0 x 40、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、
    0 x 00、0 x C 1、0 x 81、0 x 40、0 x 01、0 x C 0、0 x 80、0 x 41、0 x 01、0 x 0 C 0、0 x 80、0 x 41、
    0 x 00,0 x C 1,0 x 81,0 x 40

static const UCHAR aucCRCLo[]={
    0 x 00、0 x C 0、0 x C 1、0 x 01、0 x C 3、0 x 03、0 x 02、0 x C 2、0 x C 6、0 x 06、0 x 07、0 x C 7、
0 x 05、0 xC 5、0 xC 4、0 x 04、0 xCC、0 x 0 C、0 x 0 D、0 xCD、0 x 0 F、0 xCF、0 xCE、0 x 0 E、
    0 x 0 A、0 xCA、0 xCB、0 x 0 B、0 x C 9、0 x 09、0 x 08、0 x C 8、0 x 18、0 x 19、0 x D 9、
    0 x 1 B、0 xDB、0 xDA、0 x 1 A、0 x 1 E、0 xDE、0 xDF、0 x 1 F、0 xDD、0 x 1 D、0 x 1 C、0 xDC、
    0 x 14、0 xD 4、0 xD 5、0 x 15、0 xD 7、0 x 17、0 x 16、0 xD 6、0 xD 2、0 x 12、0 x 13、0 xD 3、
    0 x 11,0 x D 1,0 xD 0,0 x 10,0 xF 0,0 x 30,0 x 31,0 xF 1,0 x 33,0 xF 3,0 xF 2,0 x 32,
    0 x 36、0 xF 6、0 xF 7、0 x 37、0 xF 5、0 x 35、0 x 34、0 x F 4、0 x 3 C、0 xFC、0 xFD、0 x 3 D、
    0 xFF、0 x 3 F、0 x 3 E、0 xFE、0 xFA、0 x 3 A、0 x 3 B、0 xFB、0 x 39、0 xF 9、0 xF 8、0 x 38、
    0 x 28、0 xE 8、0 xE 9、0 x 29、0 xEB、0 x 2 B、0 x 2 A、0 xEA、0 xEE、0 x 2 E、0 x 2 F、0 x 2 F、0 xEF、
    0 x 2 D、0 xED、0 xEC、0 x 2 C、0 xE 4、0 x 24、0 x 25、0 xE 5、0 x 27、0 xE 7、0 xE 6、0 x 26、
    0 x 22、0 xE 2、0 xE 3、0 x 23、0 xE 1、0 x 21、0 x 20、0 xE 0、0 x A 0、0 x 60、0 x 61、0 x A 1、
    0 x 63、0 x A 3、0 x A 2、0 x 62、0 x 66、0 x A 6、0 x A 7、0 x 67、0 x A 5、0 x 65、0 x 64、0 x A 4、
    0 x 6 C、0 xAC、0 xAD、0 x 6 D、0 xAF、0 x 6 F、0 x 6 E、0 xAE、0 xAA、0 x 6 A、0 x 6 B、0 xAB、
    0 x 69、0 xA 9、0 xA 8、0 x 68、0 x 78、0 x B 8、0 x B 9、0 x 79、0 x BB、0 x 7 B、0 x 7 A、0 xBA、
    0 x BE、0 x 7 E、0 x 7 F、0 xBF、0 x 7 D、0 xBD、0 xBC、0 x 7 C、0 x 4、0 x 74、0 x 75、0 x B 5、
    0 x 77、0 x B 7、0 x B 6、0 x 76、0 x 72、0 x B 2、0 x B 3、0 x 73、0 x B 1、0 x 71、0 x 70、0 x B 0、
    0 x 50、0 x 90、0 x 91、0 x 51、0 x 93、0 x 53、0 x 52、0 x 92、0 x 96、0 x 56、0 x 57、0 x 97、
    0 x 55、0 x 95、0 x 94、0 x 54、0 x 9 C、0 x 5 C、0 x 5 D、0 x 9 D、0 x 5 F、0 x 9 F、0 x 9 E、0 x 5 E、
    0 x 5 A、0 x 9 A、0 x 9 B、0 x 5 B、0 x 99、0 x 59、0 x 58、0 x 98、0 x 88、0 x 48、0 x 49、0 x 89、
    0 x 4 B、0 x 8 B、0 x 8 A、0 x 4 A、0 x 4 E、0 x 8 E、0 x 8 F、0 x 4 F、0 x 8 D、0 x 4 D、0 x 4 C、0 x 8 C、
    0 x 44、0 x 84、0 x 85、0 x 45、0 x 87、0 x 47、0 x 46、0 x 86、0 x 82、0 x 42、0 x 43、0 x 83、
    0 x 41,0 x 81,0 x 80,0 x 40

計算法:
bit Crc_Check(ubyt *RSdata)   
/*********** ********************************************
* ,
* crc_check( ), crc
* , 5
* crc_check( ), 1 ,
***************************************************************/
{
uint crc; // 16 CRC
ubyt i,j;
crc = 0xffff;
for( i=0; i<3; i++ ) //
{
crc ^= *(RSdata+i);
for(j=8;j>0;j--)
{
if(crc & 0x0001) crc = (crc>>1) ^ 0xA001;
else crc >>= 1;
}
}
i=crc>>8;j=crc;
if((i==*(RSdata+3))&&(j==*(RSdata+4)))
return 1; //CRC , 1
else //CRC , CRC
{
*(RSdata+3) = i; // CRC ;
*(RSdata+4) = j; //CRC
return 0;
}
}