精华内容
下载资源
问答
  • CRC16校验

    2020-03-24 16:27:34
    crc16校验码的计算:采用查表的方法,测试图 #include “reg51.h” //#include “crc16.h” unsigned char tab[]={“a”}; /CRC16.c文件程序源代码/ /* CRC16计算函数,ptr-数据指针,len-数据长度,返回值-计算出的...

    几种数据的CRC16验证

    crc16校验码的计算:采用查表的方法,测试图

    #include “reg51.h”
    //#include “crc16.h”
    unsigned char tab[]={“a”};
    /CRC16.c文件程序源代码/

    /* CRC16计算函数,ptr-数据指针,len-数据长度,返回值-计算出的CRC16数值 */

    unsigned int GetCRC16(unsigned char *ptr, unsigned char len)

    {
    unsigned int index;

    unsigned char crch = 0xFF;  //高CRC字节
    
    unsigned char crcl = 0xFF;  //低CRC字节
    
    unsigned char code TabH[] = {  //CRC高位字节值表
    
        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  
    
    } ;  
    
    unsigned char code TabL[] = {  //CRC低位字节值表
    
        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  
    
    } ;
    
    
    
    while (len--)  //计算指定长度的CRC
    
    {
    
        index = crch ^ *ptr++;
    
        crch = crcl ^ TabH[index];
    
        crcl = TabL[index];
    
    }
    
    
    
    return ((crch<<8) | crcl);  
    

    }
    void main()
    {
    unsigned int a,b,c,d;
    while(1){
    a=GetCRC16(tab,1);
    b=GetCRC16(“a”,1);
    c=GetCRC16(97,1);
    d=GetCRC16(0x61,1);

    	 }
    

    }
    在这里插入图片描述
    测试数据为:tab[0]=“a”,“a”,97,0x61
    在这里插入图片描述
    返回CRC16值:a=b,c=d;

    展开全文
  • CRC 16校验

    2014-03-05 13:26:40
    CRC16的查表编程,计算机编程
  • crc16校验

    2019-08-07 15:11:00
    方法1: unsigned short updateCRC(uint16_t crc_accum, uint8_t *data_blk_ptr, uint16_t data_blk_size) { uint16_t i; static const uint16_t crc_tabl...
    
    方法1:
    
    unsigned short updateCRC(uint16_t crc_accum, uint8_t *data_blk_ptr, uint16_t data_blk_size)
    {
      uint16_t i;
      static const uint16_t crc_table[256] = {0x0000,
      0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
      0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027,
      0x0022, 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D,
      0x8077, 0x0072, 0x0050, 0x8055, 0x805F, 0x005A, 0x804B,
      0x004E, 0x0044, 0x8041, 0x80C3, 0x00C6, 0x00CC, 0x80C9,
      0x00D8, 0x80DD, 0x80D7, 0x00D2, 0x00F0, 0x80F5, 0x80FF,
      0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1, 0x00A0, 0x80A5,
      0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1, 0x8093,
      0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
      0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197,
      0x0192, 0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE,
      0x01A4, 0x81A1, 0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB,
      0x01FE, 0x01F4, 0x81F1, 0x81D3, 0x01D6, 0x01DC, 0x81D9,
      0x01C8, 0x81CD, 0x81C7, 0x01C2, 0x0140, 0x8145, 0x814F,
      0x014A, 0x815B, 0x015E, 0x0154, 0x8151, 0x8173, 0x0176,
      0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162, 0x8123,
      0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
      0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104,
      0x8101, 0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D,
      0x8317, 0x0312, 0x0330, 0x8335, 0x833F, 0x033A, 0x832B,
      0x032E, 0x0324, 0x8321, 0x0360, 0x8365, 0x836F, 0x036A,
      0x837B, 0x037E, 0x0374, 0x8371, 0x8353, 0x0356, 0x035C,
      0x8359, 0x0348, 0x834D, 0x8347, 0x0342, 0x03C0, 0x83C5,
      0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1, 0x83F3,
      0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
      0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7,
      0x03B2, 0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E,
      0x0384, 0x8381, 0x0280, 0x8285, 0x828F, 0x028A, 0x829B,
      0x029E, 0x0294, 0x8291, 0x82B3, 0x02B6, 0x02BC, 0x82B9,
      0x02A8, 0x82AD, 0x82A7, 0x02A2, 0x82E3, 0x02E6, 0x02EC,
      0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2, 0x02D0, 0x82D5,
      0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1, 0x8243,
      0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
      0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264,
      0x8261, 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E,
      0x0234, 0x8231, 0x8213, 0x0216, 0x021C, 0x8219, 0x0208,
      0x820D, 0x8207, 0x0202 };
    
      for (uint16_t j = 0; j < data_blk_size; j++)
      {
        i = ((uint16_t)(crc_accum >> 8) ^ *data_blk_ptr++) & 0xFF;
        crc_accum = (crc_accum << 8) ^ crc_table[i];
      }
    
      return crc_accum;
    }
    
    
    方法2:
    
    const uint16_t crc_table[16] = {
        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef};
    
    uint16_t crc_16(uint8_t *data, uint16_t len)
    {
        uint16_t crc16 = 0x0000;
        uint16_t crc_h4, crc_l12;
        while (len--)
        {
            crc_h4 = (crc16 >> 12);
            crc_l12 = (crc16 << 4);
            crc16 = crc_l12 ^ crc_table[crc_h4 ^ (*data >> 4)];
            crc_h4 = (crc16 >> 12);
            crc_l12 = (crc16 << 4);
            crc16 = crc_l12 ^ crc_table[crc_h4 ^ (*data & 0x0f)];
            data++;
        }
    
        return crc16;
    }
    

    转载于:https://my.oschina.net/itfanr/blog/3084716

    展开全文
  • CRC16校验、CRC32校验

    千次阅读 2017-05-02 18:13:47
    //CRC16校验 unsigned short CRC16( unsigned char* puchMsg, unsigned short usDataLen); //CRC32实现函数 unsigned int CRC32( unsigned char *buf, unsigned int len);   //CRC16校验 unsigned short CRC16...
    //CRC16校验
    unsigned short CRC16( unsigned char* puchMsg, unsigned short usDataLen);
    //CRC32实现函数
    unsigned int CRC32( unsigned char *buf, unsigned int len);

     

    //CRC16校验
    unsigned short CRC16( unsigned char* puchMsg, unsigned short usDataLen)
    {
    	static 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
    	} ;
    
    	static 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
    	};
    
    	unsigned char uchCRCHi = 0xFF ;
    	unsigned char uchCRCLo = 0xFF ;
    	unsigned char uIndex ;
    	while( usDataLen-- )
    	{
    		uIndex = uchCRCHi ^ *puchMsg++ ;
    		uchCRCHi = uchCRCLo ^ auchCRCHi[ uIndex ] ;
    		uchCRCLo = auchCRCLo[ uIndex ] ;
    	}
    	return ( uchCRCHi << 8 | uchCRCLo ) ;
    }
    
    static unsigned int   g_CRC32[256] = {0};
    static char   g_init = 0;
    //初始化表
    static void init_table()
    {
    	unsigned int   i = 0,j = 0;
    	unsigned int   crc = 0;
    	for(i = 0;i < 256;i++)
    	{
    		crc = i;
    		for(j = 0;j < 8;j++)
    		{
    			if(crc & 1)
    			{
    				crc = (crc >> 1) ^ 0xEDB88320;
    			}
    			else
    			{
    				crc = crc >> 1;
    			}
    		}
    		g_CRC32[i] = crc;
    	}
    }
    
    //CRC32实现函数
    unsigned int CRC32( unsigned char *buf, unsigned int len)
    {
    	unsigned int ret = 0xFFFFFFFF;
    	int   i;
    	if(!g_init)
    	{
    		init_table();
    		g_init = 1;
    	}
    	for(i = 0; i < len;i++)
    	{
    		ret = g_CRC32[((ret & 0xFF) ^ buf[i])] ^ (ret >> 8);
    	}
    	ret = ~ret;
    	return ret;
    }
    

     

    展开全文
  • Labview CRC16校验

    2020-10-16 16:30:59
    Labview CRC16校验
  • modbus CRC16 校验

    2018-12-21 09:29:51
    modbus CRC16 校验 C# 传入byte modbus CRC16 校验 C# 传入byte
  • 易语言汇编crc16校验源码,汇编crc16校验,Asm_CRC16
  • CRC16 校验

    2014-03-12 23:50:02
    CRC-16C(循环冗余错误校验)生成CRC-16校验字节的步聚如下: (1)装入一个16位寄存器,所有数位均为1。 (2)该16位寄存器的高位字节与开始8位字节进行“异或”运算。运算结果放入这个16位寄存器。 (3)把这个16位寄存器...
    package com.hitangjun.desk;
    
    
    public class CRC16 {
        private short[] crcTable = new short[256];
        private int gPloy = 0x8005; // 生成多项式
    
        public CRC16() {
            computeCrcTable();
        }
    
        private short getCrcOfByte(int aByte) {
            int value = aByte << 8;
    
            for (int count = 7; count >= 0; count--) {
                if ((value & 0x8000) != 0) { // 高第16位为1,可以按位异或
                    value = (value << 1) ^ gPloy;
                } else {
                    value = value << 1; // 首位为0,左移
                }
    
            }
            value = value & 0xFFFF; // 取低16位的值
            return (short)value;
        }
    
        /*
         * 生成0 - 255对应的CRC16校验码
         */
        private void computeCrcTable() {
            for (int i = 0; i < 256; i++) {
                crcTable[i] = getCrcOfByte(i);
            }
        }
    
        public short getCrc(byte[] data) {
            int crc = 0;
            int length = data.length;
            for (int i = 0; i < length; i++) {
                crc = ((crc & 0xFF) << 8) ^ crcTable[(((crc & 0xFF00) >> 8) ^ data[i]) & 0xFF];
            }
            crc = crc & 0xFFFF;
            return (short)crc;
        }
    }
    



    package com.hitangjun.desk;
    
    import java.util.Arrays;
    
    public final class CODECUtil {
        static CRC16 crc16 = new CRC16();
    
        private CODECUtil() {
        }
    
        public static byte[] short2bytes(short s) {
            byte[] bytes = new byte[2];
            for (int i = 1; i >= 0; i--) {
                bytes[i] = (byte)(s % 256);
                s >>= 8;
            }
            return bytes;
        }
    
        public static short bytes2short(byte[] bytes) {
            short s = (short)(bytes[1] & 0xFF);
            s |= (bytes[0] << 8) & 0xFF00;
            return s;
        }
    
        /*
         * 获取crc校验的byte形式
         */
        public static byte[] crc16Bytes(byte[] data) {
            return short2bytes(crc16Short(data));
        }
    
        /*
         * 获取crc校验的short形式
         */
        public static short crc16Short(byte[] data) {
            return crc16.getCrc(data);
        }
        /**
         * II、计算机算法1(比特型算法):
    1)将扩大后的数据流(6字节)高16位(BYTE[3]、BYTE[2])放入一个长度为16的寄存器;
    2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或;
        否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得);
    3)重复第2步,直到数据流(6字节)全部移入寄存器;
    4)寄存器中的值则为CRC校验码CRC[1]、CRC[0]。
         * @param args
         */
        public static void main(String[] args) {
            byte[] test = new byte[] {0, 1, 21, 5, 4};
            byte[] crc = crc16Bytes(test);
            System.out.println(Arrays.toString(crc));
            byte[] testc = new byte[test.length + 2];
            for (int i = 0; i < test.length; i++) {
                testc[i] = test[i];
            }
            testc[test.length] = crc[0];
            testc[test.length + 1] = crc[1];
        	//校验     输出的值为0 则成功
            System.out.println(crc16Short(testc));
        }
    }

    CRC循环冗余错误校验计算方法

    CRC-16C(循环冗余错误校验)生成CRC-16校验字节的步聚如下:

    (1)装入一个16位寄存器,所有数位均为1

    (2)16位寄存器的高位字节与开始8位字节进行“异或”运算。运算结果放入这个16位寄存器。

    (3)把这个16位寄存器向右移1位。

    (4a)若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算。

    (4b)若向右移出的数位是0,则返回(3)

    (5)重处处(3)(4),直至移出8位。

    (6)另外8位与该16位寄存器进行“异或”运算。

    (7)重处处(3)-(6),直至该报文所有字节均与16位寄存器进行“异或”运算,并移位8次。

    (8)这个16位寄存器的内容即2字节CRC错误校验。


    
    


    展开全文
  • CRC16校验源码

    2016-06-22 09:14:44
    CRC16校验源码
  • CRC16校验计算工具

    2017-11-22 13:30:13
    CRC16校验和计算工具,可复制代码,自动计算 CRC16校验和。
  • C#CRC16校验 源代码

    2021-06-17 09:43:29
    C#CRC16校验 源代码
  • crc16校验代码

    2019-06-17 15:17:42
    crc16校验代码,基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。
  • labview的CRC16校验

    2018-07-14 10:13:54
    labview的CRC16校验 基于Modbus RTU的CRC 校验 111111

空空如也

空空如也

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

crc16校验