컴공생의 다이어리

[c] CRC(cyclic redundancy check, 순환 중복 검사) Encoder(인코더)와 Decoder(디코더) 본문

Development/C & C++

[c] CRC(cyclic redundancy check, 순환 중복 검사) Encoder(인코더)와 Decoder(디코더)

컴공 K 2021. 6. 8. 00:01

CRC(cyclic redundancy check)란?

CRC는 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식을 말한다. 우리 말로는 순환 중복 검사라고 한다.

데이터를 전송하기 전에 주어진 데이터의 값에 따라 CRC 값을 계산하여 데이터에 붙여 전송하고, 데이터 전송이 끝난 후 받은 데이터의 값으로 다시 CRC 값을 계산하게 된다. 이어서 두 값을 비교하고, 이 두 값이 다르면 데이터 전송 과정에서 잡음 등에 의해 오류가 덧붙여 전송된 것 임을 알 수 있다.

 

 

CRC Encoder(인코더) Code

 - Encoder의 입력은 16bit, 출력은 24bit

 - divisior G = X8 + X2 + X + 1

// CRC-8 Encoder
#include<stdio.h>
#include<string.h>

int main() {
	char input[17] = { 0 };
	int input_shift[24] = { 0, };
	int g[9] = { 1,0,0,0,0,0,1,1,1 };
	char result[25] = { 0 };

	printf("--------- CRC-8 Encoder ---------\n");
	printf("Input: ");
	scanf("%s",input);
	for (int i = 0; input[i]; i++) {
		input_shift[i] = input[i] - '0';
	}
	
	for (int i = 0; i < 16; i++) {
		if (input_shift[i] == 1) {
			for (int j = 0; j < 9; j++) {
				input_shift[i + j] = g[j] ^ input_shift[i + j];
			}
		}
	}
	sprintf(result, "%s%d%d%d%d%d%d%d%d", input, input_shift[16], input_shift[17], input_shift[18], input_shift[19],
							input_shift[20], input_shift[21], input_shift[22], input_shift[23]);
	printf("Output: %s\n", result);
	return 0;
}

 

 

CRC Decoder(디코더) Code

 - Deocder의 입력은 24bit, 출력은 “NO ERROR!” 혹은 “ERROR!”

 - divisior G = X8 + X2 + X + 1

  
// CRC-8 Decoder
#include<stdio.h>
#include<string.h>

int main() {
	char input[25] = { 0 };
	int input_int[24] = { 0, };
	int g[9] = { 1,0,0,0,0,0,1,1,1 };
	char str_temp[9] = { 0 };

	printf("--------- CRC-8 Decoder ---------\n");
	printf("Input: ");
	scanf("%s",input);
	for (int i = 0; input[i]; i++) {
		input_int[i] = input[i] - '0';
	}
	for (int i = 0; i < 16; i++) {
		if (input_int[i] == 1) {
			if (input_int[i] == 1) {
				for (int j = 0; j < 9; j++) {
					input_int[i + j] = g[j] ^ input_int[i + j];
				}
			}
		}
	}
	sprintf(str_temp, "%d%d%d%d%d%d%d%d", input_int[16], input_int[17], input_int[18], input_int[19],
										  input_int[20], input_int[21], input_int[22], input_int[23]);
	int res=strcmp(str_temp,"00000000\0");
	if (res == 0) {
		printf("Output: NO ERROR!\n");
	}
	else {
		printf("Output: ERROR!!\n");
	}
	return 0;
}

 

 

 

 

 

 

https://ko.wikipedia.org/wiki/%EC%88%9C%ED%99%98_%EC%A4%91%EB%B3%B5_%EA%B2%80%EC%82%AC

 

순환 중복 검사 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 순환 중복 검사(巡環重復檢査), CRC(cyclic redundancy check)는 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을

ko.wikipedia.org

 

728x90
Comments