C语言CRC校验的问题

时间:2022-09-09 19:57:20
各位哥哥姐姐大神大牛们,最近被CRC校验这个东西困扰的不得了,很抓狂啊 C语言CRC校验的问题还有那个位运算也是,怎么搞都觉得不会,都说看不如动手,结果写的代码就没有几个是正确的,刚刚出来工作的菜鸟,做嵌入式的,很头疼,公司都给了例子了,这个文件的用这种的CRC,出来的结果就是这个,然后让我照着这种方法做软件,结果CRC一直都不会,非常的抓狂,有谁有什么非常非常详细的博文(那种大白话的最好了)让我看看,或者推荐几本书来看看(能给个代码来参考参考也行呀,网上大多数都哦不能用的感觉)。看到的快来给我指点迷津,谢谢了! C语言CRC校验的问题

6 个解决方案

#1


http://blog.csdn.net/u012993936/article/details/45339983
CRC校验不是新的技术了,为什么不去网上搜一搜,然后学习一下呢?!

#2


仅供参考:
/***** crc16.c *****/
#include <stdio.h>

#define CRC16_DNP   0x3D65u     // DNP, IEC 870, M-BUS, wM-BUS, ...
#define CRC16_CCITT 0x1021u     // X.25, V.41, HDLC FCS, Bluetooth, ...

//Other polynoms not tested
#define CRC16_IBM   0x8005u     // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ...
#define CRC16_T10_DIF   0x8BB7u     // SCSI DIF
#define CRC16_DECT  0x0589u     // Cordeless Telephones
#define CRC16_ARINC 0xA02Bu     // ACARS Aplications

#define POLYNOM     CRC16_DNP   // Define the used polynom from one of the aboves

// Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0).
unsigned short crc16(unsigned short crcValue, unsigned char newByte) {
    int i;

    for (i = 0; i < 8; i++) {
        if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){
            crcValue = (crcValue << 1)  ^ POLYNOM;
        } else {
            crcValue = (crcValue << 1);
        }
        newByte <<= 1;
    }
    return crcValue;
}

unsigned short exampleOfUseCRC16(unsigned char *Data, int len){

    unsigned short crc;
    int aux = 0;

    crc = 0x0000u; //Initialization of crc to 0x0000 for DNP
    //crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT

    while (aux < len){
        crc = crc16(crc,Data[aux]);
        aux++;
    }

    return (~crc); //The crc value for DNP it is obtained by NOT operation

    //return crc; //The crc value for CCITT
}

int main() {
    unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};

    printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078
    return 0;
}

#4


引用 1 楼 cfjtaishan 的回复:
http://blog.csdn.net/u012993936/article/details/45339983
CRC校验不是新的技术了,为什么不去网上搜一搜,然后学习一下呢?!

学了,就是不怎么会吸收啊,其他的知识点不会上网搜一下写一下代码一般也就会用了,但是CRC这个就是不怎么会,我都看了很多的资料了,就是学的不清不楚的,代码自己写的不清不楚,甚至拿网上的代码下来还是不怎么会用,有的时候回钻牛角尖,就像这次的任务一样,我怎么都算不出公司给我的那个答案

#5


crc是一种算法类型,实际实现有很多种
公司给了你什么样的资料?应该有输入,有输出结果,还应该有实际算法吧
实际算法是什么样的?是代码形式还是仅仅文字、公式描述?
你要把这些详细的资料都放出来给大家看看,甚至把你的代码也贴出来
越详细,别人才越容易看出来哪里有问题

#1


http://blog.csdn.net/u012993936/article/details/45339983
CRC校验不是新的技术了,为什么不去网上搜一搜,然后学习一下呢?!

#2


仅供参考:
/***** crc16.c *****/
#include <stdio.h>

#define CRC16_DNP   0x3D65u     // DNP, IEC 870, M-BUS, wM-BUS, ...
#define CRC16_CCITT 0x1021u     // X.25, V.41, HDLC FCS, Bluetooth, ...

//Other polynoms not tested
#define CRC16_IBM   0x8005u     // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ...
#define CRC16_T10_DIF   0x8BB7u     // SCSI DIF
#define CRC16_DECT  0x0589u     // Cordeless Telephones
#define CRC16_ARINC 0xA02Bu     // ACARS Aplications

#define POLYNOM     CRC16_DNP   // Define the used polynom from one of the aboves

// Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0).
unsigned short crc16(unsigned short crcValue, unsigned char newByte) {
    int i;

    for (i = 0; i < 8; i++) {
        if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){
            crcValue = (crcValue << 1)  ^ POLYNOM;
        } else {
            crcValue = (crcValue << 1);
        }
        newByte <<= 1;
    }
    return crcValue;
}

unsigned short exampleOfUseCRC16(unsigned char *Data, int len){

    unsigned short crc;
    int aux = 0;

    crc = 0x0000u; //Initialization of crc to 0x0000 for DNP
    //crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT

    while (aux < len){
        crc = crc16(crc,Data[aux]);
        aux++;
    }

    return (~crc); //The crc value for DNP it is obtained by NOT operation

    //return crc; //The crc value for CCITT
}

int main() {
    unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};

    printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078
    return 0;
}

#3


#4


引用 1 楼 cfjtaishan 的回复:
http://blog.csdn.net/u012993936/article/details/45339983
CRC校验不是新的技术了,为什么不去网上搜一搜,然后学习一下呢?!

学了,就是不怎么会吸收啊,其他的知识点不会上网搜一下写一下代码一般也就会用了,但是CRC这个就是不怎么会,我都看了很多的资料了,就是学的不清不楚的,代码自己写的不清不楚,甚至拿网上的代码下来还是不怎么会用,有的时候回钻牛角尖,就像这次的任务一样,我怎么都算不出公司给我的那个答案

#5


crc是一种算法类型,实际实现有很多种
公司给了你什么样的资料?应该有输入,有输出结果,还应该有实际算法吧
实际算法是什么样的?是代码形式还是仅仅文字、公式描述?
你要把这些详细的资料都放出来给大家看看,甚至把你的代码也贴出来
越详细,别人才越容易看出来哪里有问题

#6