컴공생의 다이어리
[c] CRC(cyclic redundancy check, 순환 중복 검사) Encoder(인코더)와 Decoder(디코더) 본문
Development/C & C++
[c] CRC(cyclic redundancy check, 순환 중복 검사) Encoder(인코더)와 Decoder(디코더)
컴공 K 2021. 6. 8. 00:01CRC(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
728x90
'Development > C & C++' 카테고리의 다른 글
[c] 2-layer channel coding Encoder(인코더)와 Decoder(디코더) (0) | 2021.06.11 |
---|---|
[c] (7,4)Hamming Code Encoder(인코더)와 Decoder(디코더) (0) | 2021.06.10 |
[c/c++] Ubuntu Makefile 만들기 (0) | 2021.06.01 |
[c++] 원본 행렬(original matrix)과 전치 행렬(transposed matrix) (0) | 2021.03.28 |
[c/c++] 연산자 우선순위(Operator Priority) (0) | 2021.03.18 |
Comments