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

时间:2018-05-29 04:38:24

标签: c file char byte unsigned

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 :(得分:1)

getchar()  函数族(包括getc()fgetc())的行为类似;他们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);
}

如果文件中有偶数个字节,那么最后会得到一个额外的换行符。如果这是一个问题,请记录您是退出顶部的循环(不需要换行)还是从中间退出(需要换行符)。

答案 1 :(得分:0)

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