我有一个名为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;
}
答案 0 :(得分:3)
问题是从int
到char
隐式转换fgetc
的返回值。
由于EOF
被定义为(-1)
(至少在glibc中),因此返回的char
(默认情况下在GCC中签名)将转换为{{ 1}}(带符号扩展名),如C99 standard:
如果两个操作数具有相同的类型,则不需要进一步转换。
否则,如果两个操作数都有有符号整数类型或两者都有无符号 整数类型,具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型。
因此,字符int
将转换为0xff
,实际上等于0xffffffff
的值,这会导致循环在读取所有文件之前提前结束。
此外,在使用EOF
或printf("%x", ch)
打印字符时,该字符会再次转换为printf("%02x", ch)
(请参阅here),因此您可以看到例如字符int
的输出0xffffff90
。
总之,解决方案是将0x90
定义为ch
而不是int
。