使用 C 逐字节读取文件

Nei*_*net 2 c hex byte

我正在尝试逐字节读取文件,然后使用 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)

chq*_*lie 5

您的代码中有多个问题:

  • 您不测试fopen失败,如果文件不存在或无法打开,则会导致未定义的行为。
  • 您不是逐字节读取文件,而是读取 4900 字节的块,并且只打印每个块的一个字节。
  • 您可能很快就到达文件末尾,但您没有测试文件末尾,因此输出可能来自文件的同一部分。一个错误隐藏另一个错误的经典案例。
  • 转换格式%x根据字节值输出每字节 1 或 2 个字符。这是一个问题是该文件的内容是0x000x010x100x11,其中分别产生011011,因此表观错位输入。
  • 为了清洁,你应该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)