以十六进制格式获取文件 - 我的输出与 xxd 命令输出

Posted

技术标签:

【中文标题】以十六进制格式获取文件 - 我的输出与 xxd 命令输出【英文标题】:Getting file in hex format - my output vs xxd command output 【发布时间】:2014-10-03 11:29:55 【问题描述】:

我正在尝试编写一个简单的程序来从文件生成十六进制输出。这是我的two.c 文件:

#include <stdio.h>

int 
main(void) 
    printf("%s\n", "Hello");
    return 0;

是这样编译的:

 gcc -std=c99 -Wall -Wextra -pedantic-errors two.c -o two

所以我有two 可执行文件。

现在,我编写了一个程序来读取该文件并显示它的二进制(十六进制)输出。这是我的程序:

#include <stdio.h>

int 
fileSize(FILE *ptr) 

    int size = 0;
    fseek(ptr, 0, SEEK_END);
    size = ftell(ptr);
    fseek(ptr, 0, SEEK_SET);
    return size;



int 
main(void) 

    FILE *fp;
    fp = fopen("two", "rb");
    int sz = fileSize(fp);
    char buff[ sz ];

    if (!fp) 
        printf("%s\n", "Not great at all");

    else 
        while (!feof(fp)) 
            fgets(buff, sz, fp);
            for (int i = 0; i < sz; i++) 
                printf("%02x%02x ", (buff[i] & 0xFF), (buff[i+1] & 0xFF));
                if (!(i % 8))
                    printf("\n");
            
            printf("\n");
        

    fclose(fp);


这是它的巨大输出http://pastebin.com/RVLy6H9B

问题是,当我使用 linux 命令xxd two &gt; two.hex 时,我得到了完全不同的输出(这与格式化无关)并且只有大约 500 行字节,而不是像我的输出那样大约 8k。

xxd 输出:http://pastebin.com/Gw9wg93g

问题出在哪里?读取函数fgets(buff, sz, fp);有问题吗?

【问题讨论】:

这里fp = fopen("two", "rb");你正在打开哪个文件two.c two.o 我正在打开 two 文件 - gcc 编译的输出。 ....和while (!feof(fp)) is wrong 【参考方案1】:

fgets() 在 EOF 或换行符之后停止读取。但是你的代码总是循环sz 次。

fgets() 不是读取二进制数据的正确函数。你可以改用fread()

【讨论】:

@python:另外,您不需要一次读取整个文件。您可以一次读取BUFSIZ 个字节。 是的,我知道。我只是想看看阅读是如何运作的:)

以上是关于以十六进制格式获取文件 - 我的输出与 xxd 命令输出的主要内容,如果未能解决你的问题,请参考以下文章

用于提权的Linux命令,即“xxd”

xxd使用方法

如何从 bash 查看二进制文件?

vim编辑二进制文件

使用vim打开文件的16进制形式,编辑和全文替换

解析ASCII十六进制转储以正确转换为二进制