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”将非常感激,我真的很挣扎。
答案 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");
}