以十六进制逐字节打印打开文件
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);
}
如果文件中的字节数为偶数,您将在末尾得到一个额外的换行符。如果这是一个问题,请记录您是在顶部(不需要换行符)还是从中间(需要换行符)退出循环。
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);
}
如果文件中的字节数为偶数,您将在末尾得到一个额外的换行符。如果这是一个问题,请记录您是在顶部(不需要换行符)还是从中间(需要换行符)退出循环。