Cyclic Reduendacny Check
3비트 check sum 예제임.
송신부
11010011101100
1011
1100011101100
1011
111011101100
1011
10111101100
1011
00001101100
1011
110100
1011
11000
1011
1110
1011
1010
1011
100
수신부의 뒷자리에 100 을 추가해서 검사를 하면 됨.
그리고 똑같이 1011로 XOR 연산을 하면, 마지막에 000 으로 나옴.
중첩으로 해서 최종 CRC를 구해야 함
data[3] = {0x12, 0x34, 0x0};
crc = crc8(0xac^0x34)
data[2] = crc = 0x94;
void crc8_populate_msb(u8 *table, u8 polynomial){
}
여기에서도 lookup table을 사용하고 있음.
무결성을 보장하는데 가장 앞서 있는 기술임
#include <stdio.h>
typedef unsigned char u8;
#define CRC8_TABLE_SIZE 256
void crc8_populate_msb(u8* table, u8 polynomial)
{
int i, j;
const u8 msbit = 0x80;
u8 t = msbit;
table[0] = 0;
for (i = 1; i < CRC8_TABLE_SIZE; i *= 2) {
t = (t << 1) ^ (t & msbit ? polynomial : 0);
for (j = 0; j < i; j++)
table[i + j] = table[j] ^ t;
}
}
u8 crc8(u8* table, u8* pdata, size_t nbytes, u8 crc)
{
while (nbytes-- > 0)
crc = table[(crc ^ *pdata++) & 0xff];
return crc;
}
u8 table[CRC8_TABLE_SIZE];
void display(u8* table)
{
int i;
for (i = 0; i < 256; i++)
{
printf("%02x ", table[i]);
if ((i + 1) % 16 == 0)
printf("\n");
}
}
int main()
{
freopen("output.txt", "w", stdout);
u8 data[3] = { 0x12, 0x34, 0 };
u8 crc = 0x0;
crc8_populate_msb(table, 0xd5);
display(table);
crc = crc8(table, data, 2, 0);
printf("crc=%#x\n", crc);
data[2] = crc;
//data[0]++;
//data[1]--;
//============================================
crc = crc8(table, data, 3, 0);
if (crc == 0)
printf("올바른 데이터 입니다\n");
else
printf("변형된 데이터 입니다\n");
return 0;
}
'Computer Science' 카테고리의 다른 글
Morris-Pratt Pattern Matching (0) | 2021.04.24 |
---|---|
Shift Or pattern mathcing (0) | 2021.04.24 |
State Pattern (0) | 2021.04.19 |
TS 서점 (0) | 2021.03.31 |
Heap에서 원하는 노드의 값 수정하기 (index를 관리하는 Heap 구현) (0) | 2021.03.29 |
댓글