CRC8


结论已经出来了,现在补充下正文...

碰到CRC校验好多次了..

这次在datasheet里面直接看到了。

CRC8_第1张图片


不纠结。

果断去找资料。

这个.c文件不记得从哪里扣过来的了..

/*
  * crc8.c
  *
  * Computes a 8-bit CRC
  *
  */

#include <stdio.h>
#include <windows.h>
#include <stdint.h>


#define GP  0x131   /* x^8 + x^5 + x^4 + 1 */
#define DI  0x31


static unsigned char crc8_table[256];     /* 8-bit table */
static int made_table = 0;

static void init_crc8()
/*
			* Should be called before any other crc function.
			*/
{
	int i, j;
	unsigned char crc;

	if (!made_table) {
		for (i = 0; i < 256; i++) {
			crc = i;
			for (j = 0; j < 8; j++)
				crc = (crc << 1) ^ ((crc & 0x80) ? DI : 0);
			crc8_table[i] = crc & 0xFF;
			printf("table[%d] = %d (0x%X)\n", i, crc, crc);

		}
		made_table = 1;

	}
}


void crc8(unsigned char *crc, unsigned char m)
/*
			* For a byte array whose accumulated crc value is stored in *crc, computes
			* resultant crc obtained by appending m to the byte array
			*/
{
	if (!made_table)
		init_crc8();

	*crc = crc8_table[(*crc) ^ m];
	*crc &= 0xFF;
}


int main(void)
{
	init_crc8();
	
	uint8_t i = 0;
	uint8_t crc = 0xFF;

	crc ^= i;
	crc8(&crc, 0x00);

	printf("table[%d] = %d (0x%X)\n", i, crc, crc);

	uint8_t b1 = 0xBE;
	uint8_t b2 = 0xEF;

	crc = 0xFF;
	crc ^= b1;
	crc8(&crc, 0x00);
	crc ^= b2;
	crc8(&crc, 0x00);
	printf("crc 0xBEEF = %d (0x%X)\n", crc, crc);


	system("pause");
}


然后改了改 跑起来结论跟example里面相同。

CRC8_第2张图片


然后就可以使用C的fprintf函数打印到文件。得到数组

uint8_t const c_chCrcTable[256]={
	0x00,	0x31,	0x62,	0x53,	0xC4,	0xF5,	0xA6,	0x97,	0xB9,	0x88,	0xDB,	0xEA,	0x7D,	0x4C,	0x1F,	0x2E,
	0x43,	0x72,	0x21,	0x10,	0x87,	0xB6,	0xE5,	0xD4,	0xFA,	0xCB,	0x98,	0xA9,	0x3E,	0x0F,	0x5C,	0x6D,
	0x86,	0xB7,	0xE4,	0xD5,	0x42,	0x73,	0x20,	0x11,	0x3F,	0x0E,	0x5D,	0x6C,	0xFB,	0xCA,	0x99,	0xA8,
	0xC5,	0xF4,	0xA7,	0x96,	0x01,	0x30,	0x63,	0x52,	0x7C,	0x4D,	0x1E,	0x2F,	0xB8,	0x89,	0xDA,	0xEB,
	0x3D,	0x0C,	0x5F,	0x6E,	0xF9,	0xC8,	0x9B,	0xAA,	0x84,	0xB5,	0xE6,	0xD7,	0x40,	0x71,	0x22,	0x13,
	0x7E,	0x4F,	0x1C,	0x2D,	0xBA,	0x8B,	0xD8,	0xE9,	0xC7,	0xF6,	0xA5,	0x94,	0x03,	0x32,	0x61,	0x50,
	0xBB,	0x8A,	0xD9,	0xE8,	0x7F,	0x4E,	0x1D,	0x2C,	0x02,	0x33,	0x60,	0x51,	0xC6,	0xF7,	0xA4,	0x95,
	0xF8,	0xC9,	0x9A,	0xAB,	0x3C,	0x0D,	0x5E,	0x6F,	0x41,	0x70,	0x23,	0x12,	0x85,	0xB4,	0xE7,	0xD6,
	0x7A,	0x4B,	0x18,	0x29,	0xBE,	0x8F,	0xDC,	0xED,	0xC3,	0xF2,	0xA1,	0x90,	0x07,	0x36,	0x65,	0x54,
	0x39,	0x08,	0x5B,	0x6A,	0xFD,	0xCC,	0x9F,	0xAE,	0x80,	0xB1,	0xE2,	0xD3,	0x44,	0x75,	0x26,	0x17,
	0xFC,	0xCD,	0x9E,	0xAF,	0x38,	0x09,	0x5A,	0x6B,	0x45,	0x74,	0x27,	0x16,	0x81,	0xB0,	0xE3,	0xD2,
	0xBF,	0x8E,	0xDD,	0xEC,	0x7B,	0x4A,	0x19,	0x28,	0x06,	0x37,	0x64,	0x55,	0xC2,	0xF3,	0xA0,	0x91,
	0x47,	0x76,	0x25,	0x14,	0x83,	0xB2,	0xE1,	0xD0,	0xFE,	0xCF,	0x9C,	0xAD,	0x3A,	0x0B,	0x58,	0x69,
	0x04,	0x35,	0x66,	0x57,	0xC0,	0xF1,	0xA2,	0x93,	0xBD,	0x8C,	0xDF,	0xEE,	0x79,	0x48,	0x1B,	0x2A,
	0xC1,	0xF0,	0xA3,	0x92,	0x05,	0x34,	0x67,	0x56,	0x78,	0x49,	0x1A,	0x2B,	0xBC,	0x8D,	0xDE,	0xEF,
	0x82,	0xB3,	0xE0,	0xD1,	0x46,	0x77,	0x24,	0x15,	0x3B,	0x0A,	0x59,	0x68,	0xFF,	0xCE,	0x9D,	0xAC,
};


附上打印文件的函数


void print_to_file(void)
{
	FILE * fp;
	
	fp = fopen("arr.c", "w+");

	fprintf(fp, "uint8_t const c_chCrcTable[256]={");

	for (uint8_t i = 0; i < 16; i++){
		fprintf(fp, "\n");
		for (uint8_t j = 0; j < 16; j++){
			fprintf(fp, "\t0x%02X,", crc8_table[i*16+j]);
		}
	}
	fprintf(fp, "\n};");

	fclose(fp);

}

记得包头文件。还有VS2013里面必须定义这个宏才能编译通过


#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>





你可能感兴趣的:(CRC8)