03. Digital_Engineering_HW3
03. Digital_Engineering_HW3
[toc]
Digital_Engineering_HW3
문제
1
2
1. Program in C language to print as follows:
- 메모장에 적힌 4비트 제네레이션 코드를 입력 후 .txt 파일에 적히 10 digit 바이너리 숫자를 읽은 후 CRC를 구하는 코드를 작성하시오
정답
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
101
102
103
104
105
106
107
// Homework #3 - CRC 코드 구현
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define DATA_FILE "data.txt"
#define OUTPUT_FILE "501_C289002_HW3.txt"
// XOR 함수
void xor(char *a, const char *b, int len) {
for (int i = 0; i < len; i++) {
a[i] = (a[i] == b[i]) ? '0' : '1';
}
}
// CRC 함수
void compute_crc(const char *data, const char *gen, char *crc) {
char temp[100], curr[10];
int data_len = strlen(data);
int gen_len = strlen(gen);
int crc_len = gen_len - 1;
int i, j;
for (i = 0; i < data_len; i++){
temp[i] = data[i];
}
for (j = 0; j < crc_len; j++) {
temp[i++] = '0';
}
temp[i] = '\0';
strncpy(curr, temp, gen_len);
curr[gen_len] = '\0';
int pos = gen_len;
while (pos < strlen(temp)) {
if (curr[0] == '1') xor(curr, gen, gen_len);
else xor(curr, "0000", gen_len); // 4비트 고정
for (i = 0; i < gen_len - 1; i++) {
curr[i] = curr[i + 1];
}
curr[gen_len - 1] = temp[pos++];
}
if (curr[0] == '1') {
xor(curr, gen, gen_len);
} else {
xor(curr, "0000", gen_len);
}
for (i = 0; i < crc_len; i++) {
crc[i] = curr[i + 1];
}
crc[crc_len] = '\0';
}
// 3비트 CRC -> 4비트 문자열(원래 예제를 계산하면 CRC = 0100인데 예제는 1000으로 나옴, 왼쪽 정렬 후 0 추가) 너무 어려워....
void crc_2_4bit(const char *crc3, char *final_crc) {
final_crc[0] = crc3[0];
final_crc[1] = crc3[1];
final_crc[2] = crc3[2];
final_crc[3] = '0'; // 오른쪽 0 패딩
final_crc[4] = '\0';
}
int main() {
char gen[5], data[20], crc[10], final_crc[10], result[40];
FILE *fin = fopen(DATA_FILE, "r");
FILE *fout;
if (!fin) {
printf("data.txt 파일을 열 수 없습니다.\n");
return 1;
}
printf("Please, type 4-bit generation code: ");
scanf("%4s", gen);
// 생성 다항식 유효성 검사
if (gen[0] != '1' || strchr(gen, '1') == NULL) {
printf("잘못된 입력값입니다. G는 4비트이고, 첫 비트가 반드시 1이어야 합니다.\n");
fclose(fin);
return 1;
}
fscanf(fin, "%10s", data);
fclose(fin);
compute_crc(data, gen, crc);
crc_2_4bit(crc, final_crc); // XOR 비교 없이 3비트 → 4비트 직접 변환
strcpy(result, data);
strcat(result, final_crc);
fout = fopen(OUTPUT_FILE, "w");
if (!fout) {
printf("출력 파일을 열 수 없습니다.\n");
return 1;
}
fprintf(fout, "The data with CRC is %s", result);
fclose(fout);
printf("결과가 %s 파일에 저장되었습니다.\n", OUTPUT_FILE);
return 0;
}
결과
1
2
.txt 파일에서 정상적으로 읽히고, 계산도 올바르게 된다.
단, .txt 파일과 .c 파일이 같은 위치에 있어야 함
End.