Post

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.