我正在尝试逐字节读取文件,然后使用 C 将其打印出来,但输出与十六进制编辑器的显示不匹配。
在十六进制编辑器中,前两行如下所示:
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0111 1111 1000 0000 0000
Run Code Online (Sandbox Code Playgroud)
预期输出:
00000000000000000000000000000000
00000000000001111111100000000000
Run Code Online (Sandbox Code Playgroud)
但是当我的代码输出这个时:
00000000000000000000001111111100
00000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
#include <stdio.h>
#include <string.h>
int main() {
FILE *fp;
unsigned char buffer[4900] = "";
int y;
y = 0;
fp = fopen("tugasz.ksa", "rb");
for (int x = 0; x < 4900; x++) {
fread(buffer, 1, 4900, fp);
printf("%x", buffer[x]);
}
return (0);
}
Run Code Online (Sandbox Code Playgroud)
您的代码中有多个问题:
fopen失败,如果文件不存在或无法打开,则会导致未定义的行为。%x根据字节值输出每字节 1 或 2 个字符。这是一个问题是该文件的内容是0x00,0x01,0x10和0x11,其中分别产生0,1,10和11,因此表观错位输入。fclose流。这是一个更简单的方法:
#include <stdio.h>
int main() {
FILE *fp;
int c, i, max;
fp = fopen("tugasz.ksa", "rb");
if (fp == NULL) {
fprintf(stderr, "cannot open input file\n");
return 1;
}
for (i = 0, max = 4900; i < max && (c = getc(fp)) != EOF; i++) {
printf("%02x", c);
if (i % 16 == 15)
putchar('\n'); // 16 bytes per line
else if (i % 2 == 1)
putchar(' '); // group bytes in pairs
}
if (i % 16 != 0)
putchar('\n'); // output a newline if needed
fclose(fp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)