-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.c
More file actions
100 lines (93 loc) · 4.03 KB
/
main.c
File metadata and controls
100 lines (93 loc) · 4.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <stdlib.h>
#include<unistd.h>
#define TABLE_SIZE 256
// CRC lookup table
const uint8_t crctable[TABLE_SIZE] = {
// CRC-8 SAE J1850 lookup table
// This table is based on the polynomial 0x1D
0x00, 0x1D, 0x3A, 0x27, 0x74, 0x69, 0x4E, 0x53,
0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB,
0xCD, 0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E,
0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B, 0x76,
0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4,
0x6F, 0x72, 0x55, 0x48, 0x1B, 0x06, 0x21, 0x3C,
0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19,
0xA2, 0xBF, 0x98, 0x85, 0xD6, 0xCB, 0xEC, 0xF1,
0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40,
0xFB, 0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8,
0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90, 0x8D,
0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65,
0x94, 0x89, 0xAE, 0xB3, 0xE0, 0xFD, 0xDA, 0xC7,
0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F,
0x59, 0x44, 0x63, 0x7E, 0x2D, 0x30, 0x17, 0x0A,
0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2,
0x26, 0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75,
0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80, 0x9D,
0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8,
0x03, 0x1E, 0x39, 0x24, 0x77, 0x6A, 0x4D, 0x50,
0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2,
0x49, 0x54, 0x73, 0x6E, 0x3D, 0x20, 0x07, 0x1A,
0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F,
0x84, 0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7,
0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B, 0x66,
0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E,
0xF8, 0xE5, 0xC2, 0xDF, 0x8C, 0x91, 0xB6, 0xAB,
0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43,
0xB2, 0xAF, 0x88, 0x95, 0xC6, 0xDB, 0xFC, 0xE1,
0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09,
0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C,
0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFE, 0xD9, 0xC4
};
// Function to calculate CRC-8
uint8_t crc8(uint8_t const *data, uint8_t length, uint8_t polynomial, uint8_t initialValue, uint8_t finalXOR) {
uint8_t crc = initialValue;
while (length--) {
crc ^= *data++;
for (uint8_t i = 0; i < 8; i++) {
if (crc & 0x80) {
crc = (uint8_t)(crc << 1) ^ polynomial;
} else {
crc <<= 1;
}
}
}
return crc ^= finalXOR;
}
uint8_t Compute_CRC8(uint8_t const *bytes, size_t len,uint8_t InitValue,uint8_t FinalXorValue) {
uint8_t crc = InitValue;
for (size_t i = 0; i < len; i++) {
uint8_t data = bytes[i] ^ crc;
crc = crctable[data];
}
return crc^=FinalXorValue;
}
int main() {
printf("------- Welcome -------\n");
printf("CRC-8 Bit Calculation Program\n");
printf("(1) 8-bit SAE J1850 CRC Calculation\n");
printf("(2) 8-bit 0x2F polynomial CRC Calculation\n");
printf("*****************************************\n");
printf("*****************************************\n");
printf("*****************************************\n");
for(int test = 0; test<10; test++) {
uint8_t bytes[8] = {0,};
srand(time(NULL));
for (int i = 0; i < 8; i++) {
bytes[i] = rand() % 256; // 0-255 arasında rastgele bir değer
}
for (int i = 0; i < 8; i++)
i==0?printf("0x%02X", bytes[i]):printf("-0x%02X", bytes[i]);
printf(" = Calculating CRC-8 \n");
printf("(1) 8-bit SAE J1850 CRC Calculation ===>> 0x%x \n", crc8(bytes, 8, 0x1D, 0xFF, 0xFF));
printf("(2) 8-bit 0x2F polynomial CRC Calculation ===>> 0x%x \n", crc8(bytes, 8, 0x2F, 0xFF, 0xFF));
printf(" Compute_CRC8 for table based solution => (1) => 0x%x \n", Compute_CRC8(bytes, 8, 0xff, 0xff));
printf("*****************************************\n");
printf("*****************************************\n");
printf("*****************************************\n");
sleep(1);
}
return 0;
}