急,CRC8程序,生成多项式0xB8!

在网上看了很多CRC校验的资料和程序,但没怎么看明白,怎样编写CRC8的C语言程序,生成多项式0xB8,初始值0,再次多多感谢大家了!

仅供参考:

/***** 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;
}


@ada;unsigned short a = ~0xff38 /0x0a;结果为什么是E67B?