Открытие файла побайтная печать в шестнадцатеричном виде - PullRequest
0 голосов
/ 29 мая 2018

C новичком программиста здесь.

Я пытаюсь открыть файл .obj (содержащий инструкции LC3) и печатать их группами по 2 байта построчно в шестнадцатеричном формате.Я попытался открыть файл и выполнить итерацию по char по char и распечатать в шестнадцатеричном формате, но я не уверен, как сгруппировать байты в группы по 2, чтобы напечатать их вместе.Я также распечатываю группу "fffffff" для байтов, которые приводят к 1 (я полагаю).

void readFile(const char *fileName) {
FILE *file;

file = fopen(fileName, "rb");

    char ch;
    while ((ch = fgetc(file)) != EOF) {
        if (isprint(ch)) {
            printf("%x", ch);   
        }
        else {
            printf("%02x", ch);

            if (ch == '\n') {
                fputs("\n", stdout);
            }
        }
    }
 fclose(file);
}

Вывод, который я хочу получить:

0x4500
0x2009 
0xe209 
0xa409 

Но я получаю:

0x45 
0020
09fffffffe209fffffffa40956

Я понимаю, что гекс печатает лишние "ffffffff" из-за того, что не является неподписанным символом, но я изо всех сил пытаюсь напечатать близко к желаемому выводу.Любая помощь в печати в 2-байтовых группах или как убрать "fffffff", будет с благодарностью, и я действительно изо всех сил.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Семейство функций getchar() (включая getc() и fgetc()) ведут себя одинаково;они возвращают int, а не char.Прочитайте значения в int и наслаждайтесь жизнью.

void readFile(const char *fileName)
{
    FILE *file = fopen(fileName, "rb");
    if (file == 0)
        return;

    int ch;
    while ((ch = fgetc(file)) != EOF)
    {
        printf("0x%.2x", ch);
        if ((ch = fgetc(file)) == EOF)
            break;
        printf("%.2x\n", ch);   
    }
    putchar('\n');

    fclose(file);
}

Если в файле четное количество байтов, вы получите дополнительный символ новой строки в конце.Если это проблема, ведите учет того, выходите ли вы из цикла сверху (нет необходимости в новой строке) или из середины (нужна новая строка).

0 голосов
/ 29 мая 2018

И isprint(ch), и ch == '\n' не имеют абсолютно никакого отношения к 2-байтовой группировке.

Возможно, вы хотите что-то простое, как это:

unsigned char ch;
while ((ch = (unsigned char)fgetc(file)) != EOF) {
    printf("0x%02x", ch);   
    if ((ch = (unsigned char)fgetc(file)) != EOF)
        printf("%02x", ch);
    printf("\n");
}
...