Solved
Calculate CRC-8
Hello,
I need to know how to calculate CRC-8 of input data.
I have a binary stream like (12586966 Dec or 0XC00FD6) and CRC-8(22 DEC, 0x16). Based on 0x97 polynomial how I can calculate my input binary stream CRC-8?
Thanks
Hello,
I need to know how to calculate CRC-8 of input data.
I have a binary stream like (12586966 Dec or 0XC00FD6) and CRC-8(22 DEC, 0x16). Based on 0x97 polynomial how I can calculate my input binary stream CRC-8?
Thanks
// 8-bit CRC Model - sourcer32@gmail.com
// Copyright (C) 1988-2020, All Rights Reserved
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define POLY 0x97 // # 0x197 = x^8 + x^7 + x^4 + x^2 + x^1 +1 (0x97 -> 0x197)
unsigned char Slow_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
int i;
while(Size--)
{
crc = crc ^ *Buffer++; // Apply Byte
for(i=0; i<8; i++) // Eight rounds of 1-bit
{
if (crc & 0x80)
crc = (crc << 1) ^ POLY;
else
crc = (crc << 1); // Left Shifting
}
}
return(crc);
}
unsigned char Quick_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
static const unsigned char CrcTable[] = {
0x00,0x97,0xB9,0x2E,0xE5,0x72,0x5C,0xCB, // 0x97 Polynomial Table, 4-bit, sourcer32@gmail.com
0x5D,0xCA,0xE4,0x73,0xB8,0x2F,0x01,0x96 };
while(Size--)
{
crc = crc ^ *Buffer++; // Apply Byte
crc = (crc << 4) ^ CrcTable[(crc >> 4) & 0xF]; // Two rounds of 4-bits
crc = (crc << 4) ^ CrcTable[(crc >> 4) & 0xF];
}
return(crc);
}
unsigned char Fast_CRC_Cal8Bits(unsigned char crc, int Size, unsigned char *Buffer)
{
static const unsigned char CrcTable[] = { // 0x97 Polynomial Table, 8-bit, sourcer32@gmail.com
0x00,0x97,0xB9,0x2E,0xE5,0x72,0x5C,0xCB,
0x5D,0xCA,0xE4,0x73,0xB8,0x2F,0x01,0x96,
0xBA,0x2D,0x03,0x94,0x5F,0xC8,0xE6,0x71,
0xE7,0x70,0x5E,0xC9,0x02,0x95,0xBB,0x2C,
0xE3,0x74,0x5A,0xCD,0x06,0x91,0xBF,0x28,
0xBE,0x29,0x07,0x90,0x5B,0xCC,0xE2,0x75,
0x59,0xCE,0xE0,0x77,0xBC,0x2B,0x05,0x92,
0x04,0x93,0xBD,0x2A,0xE1,0x76,0x58,0xCF,
0x51,0xC6,0xE8,0x7F,0xB4,0x23,0x0D,0x9A,
0x0C,0x9B,0xB5,0x22,0xE9,0x7E,0x50,0xC7,
0xEB,0x7C,0x52,0xC5,0x0E,0x99,0xB7,0x20,
0xB6,0x21,0x0F,0x98,0x53,0xC4,0xEA,0x7D,
0xB2,0x25,0x0B,0x9C,0x57,0xC0,0xEE,0x79,
0xEF,0x78,0x56,0xC1,0x0A,0x9D,0xB3,0x24,
0x08,0x9F,0xB1,0x26,0xED,0x7A,0x54,0xC3,
0x55,0xC2,0xEC,0x7B,0xB0,0x27,0x09,0x9E,
0xA2,0x35,0x1B,0x8C,0x47,0xD0,0xFE,0x69,
0xFF,0x68,0x46,0xD1,0x1A,0x8D,0xA3,0x34,
0x18,0x8F,0xA1,0x36,0xFD,0x6A,0x44,0xD3,
0x45,0xD2,0xFC,0x6B,0xA0,0x37,0x19,0x8E,
0x41,0xD6,0xF8,0x6F,0xA4,0x33,0x1D,0x8A,
0x1C,0x8B,0xA5,0x32,0xF9,0x6E,0x40,0xD7,
0xFB,0x6C,0x42,0xD5,0x1E,0x89,0xA7,0x30,
0xA6,0x31,0x1F,0x88,0x43,0xD4,0xFA,0x6D,
0xF3,0x64,0x4A,0xDD,0x16,0x81,0xAF,0x38,
0xAE,0x39,0x17,0x80,0x4B,0xDC,0xF2,0x65,
0x49,0xDE,0xF0,0x67,0xAC,0x3B,0x15,0x82,
0x14,0x83,0xAD,0x3A,0xF1,0x66,0x48,0xDF,
0x10,0x87,0xA9,0x3E,0xF5,0x62,0x4C,0xDB,
0x4D,0xDA,0xF4,0x63,0xA8,0x3F,0x11,0x86,
0xAA,0x3D,0x13,0x84,0x4F,0xD8,0xF6,0x61,
0xF7,0x60,0x4E,0xD9,0x12,0x85,0xAB,0x3C };
while(Size--)
{
crc = crc ^ *Buffer++; // Apply Byte
crc = CrcTable[crc & 0xFF]; // One round of 8-bits
}
return(crc);
}
int main(int argc, char **argv)
{
unsigned char crc;
unsigned char test[] = { 0xC0, 0x0F, 0xD6 };
/* The expected CRC value of test[] using the polynomial 0x97 is 0x16, when initialized with 0x00 */
printf("crc=%02X Slow\n", Slow_CRC_Cal8Bits(0x00, sizeof(test), test));
printf("crc=%02X Quick\n", Quick_CRC_Cal8Bits(0x00, sizeof(test), test));
printf("crc=%02X Fast\n", Fast_CRC_Cal8Bits(0x00, sizeof(test), test));
return(1);
}Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.