精华内容
下载资源
问答
  • CRC16查表法

    热门讨论 2013-08-05 07:01:53
    最近在搞CRC校验,用的是CRC16标准,查看了很多资料发现很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标准中的采用查表法的方式中那两个表格中的数是如何求出来的。可惜没有一个文章仔细的讲,更没有文章给出...
  • 绪论在网上浏览了不少关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法。至于查的表是怎么来的,软件为何要这样实现不少文章并无说明。本篇文章就针对这两...

    绪论

    在网上浏览了不少关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法。

    至于查的表是怎么来的,软件为何要这样实现不少文章并无说明。本篇文章就针对这两点问题进行总结和概括,有错误的地方欢迎你们评论区指出,不胜感激。

    注意:本篇文章不涉及CRC校验的基本原理,若是不了解CRC的基本原理,请移步至以下连接:

    CRC查找表法推导及代码实现比较

    如下的CRC查表法的软件实现及推导过程均创建在modbusRTU协议使用的CRC-16标准。

    html

    查表法的表是怎么来的?

    CRC16算法的生成多项式x 16 + x 15 + x 2 + 1 x^{16}+x^{15}+x^2+1x16+x15+x2+1,十六进制表示为0x8005。

    CRC16常见的表格中的数据是按照先传输LSB,消息右移进寄存器来计算的。所以须要判断寄存器的最低位LSB,同时要将0x8005按位颠倒后(0xA001)根据LSB的状况决定是否与寄存器异或便可。

    CRC16的表格中对应的数依次为0~255计算出来的CRC值,所以,此处只选取其中一两个数做为实例计算CRC值。

    具体步骤以下所示:

    1)从0~255中选取须要计算的数,将其对应的十六进制数放入一个长度为16的寄存器的低八位,高八位填充0;

    2)若是寄存器的末位LSB为1,将寄存器的数值右移1位,再与0xA001位异或,不然仅将寄存器右移1位;

    3)重复第2步,直到低八位所有右移出寄存器;

    4)寄存器中的值则为校验码。

    例如选择0x01做为计算CRC值:

    算法

    CRC-16的表格计算

    举例:0x0001

    多项式:0xA001

    初始值:0x0000

    如下为二进制显示

    00000001 高八位填充0,与初始值异或 获得:

    00000000 00000001 第一次

    因为LSB=1 右移一位,高位添0

    00000000 00000000 与0xA001异或 获得:

    10100000 00000001第二次

    因为LSB=1 右移一位,高位添0

    01010000 00000000 与0xA001异或 获得:

    11110000 00000001 第三次

    因为LSB=1 右移一位,高位添0

    01111000 00000000 与0xA001异或 获得:

    11011000 00000001 第四次

    因为LSB=1 右移一位,高位添0

    01101100 00000000 与0xA001异或 获得:

    11001100 00000001 第五次

    因为LSB=1 右移一位,高位添0

    01100110 00000000 与0xA001异或 获得:

    11000110 00000001 第六次

    因为LSB=1 右移一位,高位添0

    01100011 00000000 与0xA001异或 获得:

    11000011 00000001 第七次

    因为LSB=1 右移一位,高位添0

    01100001 10000000 与0xA001异或 获得:

    11000001 10000001 第八次

    因为LSB=1 右移一位,高位添0

    01100000 11000000 与0xA001异或 获得:

    11000000 11000001 结束 获得0xC0 C1

    此数值即为CRC校验值,该数值也是CRC校验表上的0x01位置上的值

    咱们对照一下CRC校验表,C0 C1分别为两张表中位置为1的数值(0开始),CRC校验表见“软件实现方法”部分。ui

    固然,细心的朋友在实际应用的时候发现,若是使用CRC-16(modbus)参数模型计算CRC校验和上面的计算结果有很大差别,咱们这里使用CRC校验计算器来计算校验和,连接以下:

    连接: CRC在线计算

    设置如截图所示:

    98be10cfde2adaef40bdfce371ca1411.png

    计算结果为807E,并非咱们以前计算出来的C0C1。

    缘由就在于初始值不同,modbus参数模型要求初始值为FFFF,而CRC校验表中的数据是利用初始值0000计算获得的,若是将初始值更改成0000,其余参数不变的话,咱们能够利用计算器很顺利的获得C0C1,以下截图所示:

    70b4146e80ac2be15521bfa1e437c895.png

    modbus参数模型在计算多组数据时,上一个数据计算出来的CRC校验和是保存在CRC寄存器中,参与下一个数据的计算。

    这里总结了一下使用modbus参数模型计算CRC-16的计算步骤:

    spa

    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值。

    软件实现方法

    const uint32_t auchCRCHi[256] =

    {

    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

    };

    const uint32_t auchCRCLo[256] =

    {

    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

    };

    void crc16_str_sent(uint32_t *ptr, uint32_t len)

    {

    WORD_BYTE calc_crc;

    uint32_t uIndex;

    calc_crc.word=0xffff;

    for(; len; len--)

    {

    uIndex = calc_crc.byte.low ^ (*ptr);

    calc_crc.byte.low = calc_crc.byte.high ^ auchCRCHi[uIndex];

    calc_crc.byte.high = auchCRCLo[uIndex];

    ptr++;

    }

    (*ptr) = calc_crc.byte.low;

    ptr++;

    (*ptr) = calc_crc.byte.high;

    }

    uint32_t crc16_str_rece(uint32_t *ptr, uint32_t len)

    {

    WORD_BYTE calc_crc;

    uint32_t uIndex;

    uint32_t dat;

    calc_crc.word=0xffff;

    for(; len; len--)

    {

    uIndex = calc_crc.byte.low ^ (*ptr);

    calc_crc.byte.low = calc_crc.byte.high ^ auchCRCHi[uIndex];

    calc_crc.byte.high = auchCRCLo[uIndex];

    ptr++;

    }

    if( ((*ptr)==calc_crc.byte.low) && ((*(ptr+1))==calc_crc.byte.high) )

    dat = 1;

    else

    dat = 0;

    return(dat);

    }

    注意:以上代码仅仅做为参考代码,使用不一样的编译器须要对代码进行简单的移植或处理便可使用。.net

    展开全文
  • CRC16 查表法校验与计算源代码,包含crc16.c与crc16.h两个文件 (1)查表 (2)计算函数 (3)校验函数
  • CRC16 查表法验证校验

    2009-08-10 14:26:05
    CRC16 查表法验证校验,CRC16 查表法验证校验,CRC16 查表法验证校验
  • CRC16 查表法

    2014-05-09 12:56:00
    1 static const unsigned short crc16_table[256]= 2 { 3 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 4 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481,...
     1 static const unsigned short crc16_table[256]=
     2 {
     3         0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
     4         0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
     5         0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
     6         0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
     7         0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
     8         0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
     9         0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
    10         0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
    11         0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
    12         0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
    13         0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
    14         0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
    15         0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
    16         0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
    17         0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
    18         0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
    19         0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
    20         0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
    21         0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
    22         0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
    23         0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
    24         0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
    25         0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
    26         0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
    27         0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
    28         0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
    29         0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
    30         0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
    31         0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
    32         0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
    33         0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
    34         0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
    35 };
    36 
    37 void crc16_init(unsigned short *crc16)
    38 {
    39     (*crc16) = 0x0000;
    40 }
    41 
    42 void crc16_calc_byte(unsigned short *crc16, unsigned char uc)
    43 {
    44     (*crc16) = ((*crc16) >> 8) ^ crc16_table[((*crc16) ^ uc) & 0xff];
    45 }
    46 
    47 unsigned short crc16_calc_bytearray(unsigned char *data, unsigned long count)
    48 {
    49     unsigned long     i;
    50     unsigned short    crc16;
    51 
    52     crc16_init(&crc16);
    53 
    54     for(i = 0; i < count; i++)
    55     {
    56         crc16_calc_byte(&crc16, data[i]);
    57     }
    58 
    59     return crc16;
    60 }

     

    转载于:https://www.cnblogs.com/paullam/p/3718679.html

    展开全文
  • CRC8 CRC16 查表法

    2021-01-06 20:55:14
    CRC8查表法 /***************************************************** 描 述: CRC8校验子程序 x^8+x^5+x^4+x^0 入口参数: 指向数组指针,校验字节个数 出口参数: 8位CRC校验码 ***************************...

    转自:http://blog.chinaunix.net/uid-14114479-id-1988515.html

    CRC8查表法

     

    /*****************************************************
        描    述:  CRC8校验子程序 x^8+x^5+x^4+x^0
        入口参数:  指向数组指针,校验字节个数
        出口参数:  8位CRC校验码
    ******************************************************/

    const char CRC8Table[]={
      0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
      157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
      35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
      190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
      70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
      219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
      101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
      248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
      140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
      17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
      175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
      50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
      202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
      87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
      233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
      116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
    };


    unsigned char CRC8_Table(unsigned char *p, char counter)
    {
        unsigned char crc8 = 0;

        for( ; counter > 0; counter--){
            crc8 = CRC8Table[crc8^*p];
            p++;
        }
        return(crc8);

    }

    /*****************************************************
        描    述:  text
    ******************************************************/
    void main()
    {
        unsigned  char  a[] = {0x02, 0x03};

        printf("%d", CRC8_Table(&a, 2));

        getch();
    }

     

                                                       CRC16查表法

     

     

    /*

    *****************************************************************************************

     

                                    创 建 人: L J

                                    修改时间: 2008-7-9

                                    描    述: CRC16 校验

     

    ******************************************************************************************

    */

     

     

    unsigned int CRC16Table[256]={               /* CRC16 余式表 */

        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,

        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,

        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,

        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,

        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,

        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,

        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,

        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,

        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,

        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,

        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,

        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,

        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,

        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,

        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,

        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,

        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,

        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,

        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,

        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,

        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,

        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,

        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,

        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,

        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,

        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,

        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,

        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,

        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,

        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,

        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,

        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0

    };

     

     

    /*************************************************************

        描    述:  CRC16校验查表子程序,速度快,占用空间大

        入口参数:  指向数组指针,校验字节个数

        出口参数:  16位CRC校验码

    **************************************************************/

    unsigned int CRC16_Table(unsigned char *pcrc, unsigned char count)

    {

        unsigned int  crc16 = 0;

        unsigned char crcregister;

     

     

        for( ; count > 0; count--){

            crcregister = (unsigned int)crc16 >> 8;

            crc16 <<= 8;

            crc16 ^= CRC16Table[crcregister ^ *pcrc];

            pcrc++;

        }

        return(crc16);

    }

     

     

     

    /*****************************************************

        描    述:  text

    ******************************************************/

    unsigned char king[]={0x00, 0x11, 0x22};

     

     

    void main()

    {

      printf("0x%x", CRC16_Table(king, 3));

     

     

      getch();

    }

    展开全文
  • CRC16查表法校验编程

    2021-03-27 19:02:04
    CRC校验 ...CRC16校验表:CRC-CCITT using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace

    CRC校验
    循环冗余校验,是一种数据传输检错功能,对数据进行多项式计算,并将校验结果附在帧后面,生成一个新帧发送给通讯设备。
    CRC16多项式:x16+x15+x2+1
    CRC16校验表:CRC-CCITT

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;
    namespace Crc_Eg
    {
        class Program
        {
         public static UInt16 CRC16_INIT_VAL = 0x0000;
         //CRC16静态表
         public static UInt16[] Crc16Table = new UInt16[256]{0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
         0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
         0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
         0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
         0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
         0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
         0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
         0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
         0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
         0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
         0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
         0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
         0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
         0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
         0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
         0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
         0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
         0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
         0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
         0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
         0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
         0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
         0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
         0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
         0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
         0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
         0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
         0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
         0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
         0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
         0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
         0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0};
            /// <summary>
            /// 计算Crc16 查表法
            /// </summary>
            /// <param name="buffer"></param>
            /// <returns></returns>
            public static UInt16 Crc16(byte[] buffer)
            {
                UInt16 ulCrc = CRC16_INIT_VAL;
                int i=0;
                while(i<buffer.Length)
                {
                    ulCrc=(UInt16)((ulCrc<<8)^Crc16Table[((ulCrc>>8)^buffer[i++])&0xff]);
                }
                return ulCrc;
            }
            /// <summary>
            /// 十六进制转换为字节
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            public static byte[] HexStringToByteArray(string s)
            {
                string  str=s.Replace(" ","");
                byte[] buffer = new byte[str.Length / 2];
                for (int i = 0; i < str.Length; i += 2)
                {
                    buffer[i / 2] = (byte)Convert.ToByte(str.Substring(i,2),16);
                }
                return buffer;
    
            }
            static void Main(string[] args)
            {
                //7E 00 01 00 04 30 70 01 01 E6 96 7F
                byte[] buffer = HexStringToByteArray("00 01 00 04 30 70 01 01");
                UInt16 crc = Crc16(buffer);
                //高字节两位
                string CrcHigh = string.Format("{0:X}",crc/256).PadLeft(2,'0');
                //低字节两位
                string CrcLow = string.Format("{0:X}", crc % 256).PadLeft(2, '0');
                Console.WriteLine(CrcHigh+" "+CrcLow);
                Console.ReadLine();
            }
        }
    }
    
    
    展开全文
  • [计算机]CRC16查表法中表格数据计算方法及实例最近在搞CRC校验,用的是CRC16标准,查看了很多资料发现很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标准中的采用查表法的方式中那两个表格中的数是如何求出来的。...
  • 循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除及余数的原理来作错误侦测(Error Detecting)的。...②CRC-16码; ③CRC-CCITT码; ④CRC-32码。 CRC-12码通常用来传送6-
  • CRC16查表法余式表生成程序源码

    热门讨论 2012-02-18 12:41:10
    可以根据输入的生成多项式计算出CRC-16的余式表,并输出到TXT文件打开。附赠CRC-16查表计算程序和直接计算程序,供实际验证计算效果。
  • Golang实现CRC16查表法

    2020-08-17 19:51:12
    0x1, 0xC0, 0x80, 0x41, 0x0, 0xC1, 0x81, 0x40 } func bb_CRC16(uchar_puchmsg [] byte ,uchar_usdatalen int ) int{ uchar_clclo :=0x00 uchar_clchi :=0x00 uchar_uindex :=0 for i:=0; uchar_usdatalen > 0...
  • qt实现crc16 查表法

    2018-02-28 12:47:47
    #ifndef COMMON_H #define COMMON_H #include <QString> #include <QByteArray> const quint8 chCRCHTalbe[] = // CRC 高位字节值表 { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC...
  • 整合CRC16查表法

    千次阅读 2013-08-26 10:55:32
    这里,不讨论CRC的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得CRC校验码,作一个比较详细的说明。  标准CRC生成多项式如下表:  名称 生成多项式 简记式* 标准引用  CRC...
  • C# CRC16 查表法

    2014-02-25 10:22:00
     if ((bufout[count - 2] == (byte)(crc16 >> 8)) && (bufout[count - 1] == (byte)(crc16 & 0xff))) { return true; } else { return false; } } 转载于:https://www.cnblogs.com/armyfai/p/3566144.html
  • https://wenku.baidu.com/view/c483404b767f5acfa1c7cd9e.html
  • golang crc校验 crc8 crc32 查表法

    千次阅读 2019-06-26 10:23:47
    golang crc校验 crc8 crc32 查表法 package util import ( "math" ) var crc32tab = []uint32{ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0...
  • CRC校验查表法原理及实现(CRC-16

    千次阅读 2020-08-05 15:14:58
    绪论 在网上浏览了很多关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体...以下的CRC查表法的软件实现及推导过程均建立在modbusRTU协议使用的CRC-16标准。 查表法的表是
  • CRC32 查表法代码检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据...
  • 基于FPGA的16bit CRC校验查表法设计.pdf
  • CRC(查表法)-表的由来

    2015-10-14 18:52:39
    CRC(查表法)-表的由来
  • 用go仿写了一个CRC16校验方法var (aucCRCHi = []byte{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, 0...
  • delphi 版CRC16 查表算法

    2014-03-27 08:35:41
    国为一个项目的原因需要delphi 版CRC16 查表算法,找了好久了,很多都不能用,有些算出来也不对。网上其它地方,需要的话就下吧。我的Delphi2009下测试能用。
  • CRC效验,查表法CRC16,简单方便可靠
  • CRC8查表法

    千次阅读 2015-09-09 11:19:39
    /**********************************... 描 述: CRC8校验子程序 x^8+x^5+x^4+x^0 入口参数: 指向数组指针,校验字节个数 出口参数: 8位CRC校验码 ******************************************************/ cons

空空如也

空空如也

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

crc16查表法