본문 바로가기
Computer Science

CRC 개념

by OKOK 2021. 4. 24.

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

댓글