以十六进制逐字节打印打开文件

Opening File byte by byte printing in hex

C程序员新手在此

我正在尝试打开一个 .obj 文件(包含 LC3 指令)并以 2 字节为一组以十六进制形式逐行打印它们。我试过打开文件并逐个字符迭代并以十六进制打印,但我不确定如何将字节以 2 为一组进行分组以将它们打印在一起。我还为以 1 开头的字节打印了一组 "fffffff"(我假设)。

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"s,因为它不是无符号字符,但我正在努力打印接近所需的输出。任何有关以 2 字节组打印或如何删除 "fffffff" 的帮助将不胜感激,我真的很挣扎。

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");
}

getchar() 函数族(包括 getc() and fgetc()) all behave similarly; they return an int, not a 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);
}

如果文件中的字节数为偶数,您将在末尾得到一个额外的换行符。如果这是一个问题,请记录您是在顶部(不需要换行符)还是从中间(需要换行符)退出循环。