使用c以二进制模式读取文件

时间:2016-05-31 21:05:18

标签: c io binary

我有一个名为re.exe的可执行文件,我希望以二进制形式阅读其内容,然后在控制台中显示该内容。我编写以下代码但它没有显示控制台中二进制文件的内容。有什么问题?

#include <stdio.h>
#include <ctype.h>

void readFile(const char *fileName) {
    FILE *file;
    file = fopen(fileName, "rb");
    if (file != NULL) {
        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);
    }
}

int main() {

    readFile("re.exe");

    return 0x0;
}

1 个答案:

答案 0 :(得分:3)

问题是从intchar隐式转换fgetc的返回值。

由于EOF被定义为(-1)(至少在glibc中),因此返回的char(默认情况下在GCC中签名)将转换为{{ 1}}(带符号扩展名),如C99 standard

的第6.3.1.8节所述
  

如果两个操作数具有相同的类型,则不需要进一步转换。

     

否则,如果两个操作数都有有符号整数类型或两者都有无符号     整数类型,具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型。

因此,字符int将转换为0xff,实际上等于0xffffffff的值,这会导致循环在读取所有文件之前提前结束。

此外,在使用EOFprintf("%x", ch)打印字符时,该字符会再次转换为printf("%02x", ch)(请参阅here),因此您可以看到例如字符int的输出0xffffff90

总之,解决方案是将0x90定义为ch而不是int