zoukankan      html  css  js  c++  java
  • CRC校验的问题(c语言实现CRC校验和)

    1. 前面的数 7A 01 00,计算的结果是0X4920

    2. 那么把数据CRC加上

    3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!!

    4. 换了套代码,还是一样的值,难道说,CRC检验的必须是双数字节吗?我输入的是5个,或许我可以输入6个测试一下,也不行

    5. 去CRC官网看了一下

    对比下代码发现,CRC-16用的多项式应该是0XA001,总上所述,第3步的代码是错误的。那么我有疑问,为啥第3步的代码居然还有人在用?而且使用正确,我猜测那套产生自己的CRC,又检验自己的CRC,说起来是定制化的一套CRC,不是标准的CRC,所以那套CRC只能自产自销,如果去校验另外一个人产生的标准的CRC数据就会出错了。

    6. 下面是从gitHUB上下载的代码实际测试可用。https://github.com/lammertb/libcrc

    uint16_t crc_sick( const unsigned char *input_str, size_t num_bytes ) {
    
        uint16_t crc;
        uint16_t low_byte;
        uint16_t high_byte;
        uint16_t short_c;
        uint16_t short_p;
        const unsigned char *ptr;
        size_t a;
    
        crc     = CRC_START_SICK;
        ptr     = input_str;
        short_p = 0;
    
        if ( ptr != NULL ) for (a=0; a<num_bytes; a++) {
    
            short_c = 0x00FF & (uint16_t) *ptr;
    
            if ( crc & 0x8000 ) crc = ( crc << 1 ) ^ CRC_POLY_SICK;
            else                crc =   crc << 1;
    
            crc    ^= ( short_c | short_p );
            short_p = short_c << 8;
    
            ptr++;
        }
    
        low_byte  = (crc & 0xFF00) >> 8;
        high_byte = (crc & 0x00FF) << 8;
        crc       = low_byte | high_byte;
    
        return crc;
    
    }  /* crc_sick */
  • 相关阅读:
    linux 回收站 路径
    Linux 让进程在后台可靠运行的几种方法
    用marquee和div+js实现首尾相连循环滚动效果
    轻型数据库SQLite结合PHP的开发
    linux系统权限修复——学生误操作!
    2009级 毕业设计 题目
    linux下硬盘uuid查看及修改设置
    创建网站地图
    用上下左右箭头键在textbox中的光标跳转
    SHELL中时间的比较
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/11079586.html
Copyright © 2011-2022 走看看