Last active
December 15, 2015 12:29
-
-
Save kohyama/5260703 to your computer and use it in GitHub Desktop.
CRC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#define u16 unsigned short | |
#define u8 unsigned char | |
static u16 | |
crc16(u8 *p, int n) | |
{ | |
static const u16 wCRCTable[] = { | |
0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241, | |
0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440, | |
0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40, | |
0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841, | |
0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40, | |
0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41, | |
0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641, | |
0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040, | |
0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240, | |
0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441, | |
0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41, | |
0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840, | |
0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41, | |
0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40, | |
0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640, | |
0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041, | |
0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240, | |
0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441, | |
0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41, | |
0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840, | |
0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41, | |
0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40, | |
0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640, | |
0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041, | |
0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241, | |
0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440, | |
0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40, | |
0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841, | |
0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40, | |
0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41, | |
0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641, | |
0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040 }; | |
u8 t; | |
u16 w = 0xFFFF; | |
while (n--) | |
{ | |
t = *p++ ^ w; | |
w >>= 8; | |
w ^= wCRCTable[t]; | |
} | |
return w; | |
} | |
int | |
main() | |
{ | |
char *d, *t, text[1024], t2[3] = " "; | |
u8 *b, buf[1024]; | |
u16 crc; | |
int i; | |
while (fgets(text, 1024, stdin) != NULL) { | |
for (t = text, b = buf; *t != '\n'; b++) { | |
t2[0] = *t++; | |
if (*t == '\n') | |
break; | |
t2[1] = *t++; | |
*b = strtoul(t2, &d, 16); | |
} | |
for (i = 0; i < b - buf; i++) | |
printf("%02x", buf[i]); | |
crc = crc16(buf, b - buf); | |
printf("%02x%02x", ((u8 *)&crc)[0], ((u8 *)&crc)[1]); | |
printf("\n"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://blog.goo.ne.jp/masaki_goo_2006/e/69f286d90e6140e6e8c021e43a11c815 | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <limits.h> // CHAR_BIT | |
#define u8 unsigned char | |
#define u16 unsigned short | |
// 記号定数 | |
// #define MSB_CRC8 (0x85) // x8 + x7 + x2 + x0 | |
// 8 7654 3210 | |
// example of the URL 8720 * 1000 0101 = 0x85 | |
// CRC8 876420 * 1101 0101 = 0xd5 | |
// CRC8-CCITT 87320 * 1000 1101 = 0x8d | |
// CRC8-SAEJ1850 ... | |
// CRC8-ATM ... | |
// CRC8-Dallas/Maxim 8540 * 0011 0001 = 0x31 <- This is for SHT2x | |
#define MSB_CRC8 (0x31) | |
static unsigned char CRC8Table[ 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, | |
}; | |
// CRC8の計算(生成多項式:0x85,左送り) | |
static unsigned char crc8_1( const void *buff, size_t size ) | |
{ | |
unsigned char *p = (unsigned char *)buff; | |
unsigned char crc8; | |
int i; | |
for ( crc8 = 0x00 ; size != 0 ; size-- ){ | |
crc8 ^= *p++; | |
for (i = 0 ; i < CHAR_BIT ; i++ ){ | |
if ( crc8 & 0x80 ){ | |
crc8 <<= 1; crc8 ^= MSB_CRC8; | |
} | |
else{ | |
crc8 <<= 1; | |
} | |
} | |
} | |
return crc8; | |
} | |
u8 | |
crc8_2(u8 *d, int n) | |
{ | |
int i; | |
u8 bit, crc; | |
for (i = 0; i < n; i++) { | |
crc ^= d[i]; | |
for (bit = 8; bit > 0; bit--) { | |
if (crc & 0x80) | |
crc = (crc<<1)^0x131; | |
else | |
crc = (crc<<1); | |
} | |
} | |
return crc; | |
} | |
// CRC8テーブルから計算 | |
static unsigned char crc8_3( const void *buff, size_t size ) | |
{ | |
unsigned char *data = (unsigned char *)buff; | |
unsigned char crc8 = 0x00; | |
while ( size != 0 ){ | |
crc8 = CRC8Table[ crc8 ^ *data ]; | |
data++; | |
size--; | |
} | |
return crc8; | |
} | |
int | |
main() | |
{ | |
char *d, *t, text[1024], t2[3] = " "; | |
u8 *b, buf[1024]; | |
u8 c1, c2, c3; | |
int i; | |
while (fgets(text, 1024, stdin) != NULL) { | |
for (t = text, b = buf; *t != '\n'; b++) { | |
t2[0] = *t++; | |
if (*t == '\n') | |
break; | |
t2[1] = *t++; | |
*b = strtoul(t2, &d, 16); | |
} | |
for (i = 0; i < b - buf; i++) | |
printf("%02x", buf[i]); | |
c1 = crc8_1(buf, b - buf); | |
c2 = crc8_2(buf, b - buf); | |
c3 = crc8_3(buf, b - buf); | |
printf(", %02x, %02x, %02x", c1, c2, c3); | |
printf("\n"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <limits.h> // CHAR_BIT | |
// 記号定数 | |
#define MSB_CRC8 (0x31) // x8 + x5 + x4 + x0 | |
// CRC8テーブルの初期化 | |
static void InitCRC8Table( unsigned char table[256] ) | |
{ | |
unsigned char value; | |
int i, n; | |
for (n = 0 ; n < 256 ; n++ ){ | |
value = (unsigned char)(n << (8 - CHAR_BIT)); // value = n; | |
for ( i = 0 ; i < CHAR_BIT ; i++ ){ | |
if ( value & 0x80 ){ | |
value <<= 1; value ^= MSB_CRC8; | |
} | |
else{ | |
value <<= 1; | |
} | |
} | |
table[ n ] = value; | |
} | |
} | |
// CRC8テーブルの表示 | |
static void ListCRC8Table( unsigned char table[256] ) | |
{ | |
unsigned char *p = table; | |
int i, j, k; | |
printf( "static unsigned char CRC8Table[ 256 ] = {\n" ); | |
for ( k = 3 ; k >= 0 ; k-- ){ | |
for ( j = 0 ; j < 8 ; j++ ){ | |
for ( i = 0 ; i < 8 ; i++ ){ | |
printf( (i == 0) ? "\t" : " " ); | |
printf( "0x%02X,", *p++ ); | |
} | |
printf( "\n" ); | |
} | |
if ( k != 0 ) printf( "\t\n" ); | |
} | |
printf( "};\n" ); | |
} | |
// メイン関数 | |
int main( void ) | |
{ | |
unsigned char table[ 256 ]; | |
InitCRC8Table( table ); | |
ListCRC8Table( table ); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment