Загрузка данных


#include <stdio.h>

int hex_value(char c) {
    int res = -1;  // результат

    if (c >= '0' && c <= '9') {
        res = c - '0';
    } else if (c >= 'A' && c <= 'F') {
        res = c - 'A' + 10;
    }

    return res;
}

int print_hex_code(char c) {
    int n = c;       // числовой код символа
    int a = n / 16;  // первая цифра HEX-кода
    int b = n % 16;  // вторая цифра HEX-кода

    if (a < 10) {
        printf("%c", a + '0');
    } else {
        printf("%c", a - 10 + 'A');
    }

    if (b < 10) {
        printf("%c", b + '0');
    } else {
        printf("%c", b - 10 + 'A');
    }

    return 1;
}

int print_decoded_char(char a, char b) {
    int res = 1;          // результат
    int n1 = hex_value(a);  // первое число из HEX
    int n2 = hex_value(b);  // второе число из HEX

    if (n1 == -1 || n2 == -1) {
        res = 0;
    } else {
        printf("%c", n1 * 16 + n2);
    }

    return res;
}

int encode_mode() {
    int res = 1;  // результат
    char c;       // символ
    char sep;     // разделитель

    if (scanf("%c%c", &c, &sep) != 2) {
        res = 0;
    }

    while (res == 1) {
        if (sep != ' ' && sep != '\n') {
            res = 0;
        } else {
            print_hex_code(c);

            if (sep == '\n') {
                res = 2;
            } else {
                printf(" ");

                if (scanf("%c%c", &c, &sep) != 2) {
                    res = 0;
                }
            }
        }
    }

    return res;
}

int decode_mode() {
    int res = 1;  // результат
    char a;       // первый HEX-символ
    char b;       // второй HEX-символ
    char sep;     // разделитель

    if (scanf("%c%c%c", &a, &b, &sep) != 3) {
        res = 0;
    }

    while (res == 1) {
        if (sep != ' ' && sep != '\n') {
            res = 0;
        } else if (!print_decoded_char(a, b)) {
            res = 0;
        } else {
            if (sep == '\n') {
                res = 2;
            } else {
                printf(" ");

                if (scanf("%c%c%c", &a, &b, &sep) != 3) {
                    res = 0;
                }
            }
        }
    }

    return res;
}

int main(int argc, char *argv[]) {
    int res = 0;  // результат

    if (argc == 2 && argv[1][1] == '\0') {
        if (argv[1][0] == '0') {
            res = encode_mode();
        } else if (argv[1][0] == '1') {
            res = decode_mode();
        }
    }

    if (res == 0) {
        printf("n/a");
    }

    return 0;
}