C语言中读取ELF文件的正确方法

C语言中读取ELF文件的正确方法,c,elf,fread,C,Elf,Fread,第一次在这里发帖,谷歌搜索了几个小时,我什么也没找到 我正在尝试编写一个客户端程序,读取不同的文件并通过web将它们发送到服务器程序。(用于备份目的。) 到目前为止,我已经使用fread()将文件放入缓冲区,其方式类似于: 它对纯文本文件很有效,但当我尝试传输可执行文件时,fread()似乎不会读取文件,只会将“ELF”读入缓冲区 我的问题是,在C语言中,将ELF文件的内容读入缓冲区的正确方法是什么 谢谢。读取二进制文件的正确方法就是使用fread()。但请记住,不能将内容视为字符串,这意味着

第一次在这里发帖,谷歌搜索了几个小时,我什么也没找到

我正在尝试编写一个客户端程序,读取不同的文件并通过web将它们发送到服务器程序。(用于备份目的。)

到目前为止,我已经使用fread()将文件放入缓冲区,其方式类似于:

它对纯文本文件很有效,但当我尝试传输可执行文件时,fread()似乎不会读取文件,只会将“ELF”读入缓冲区

我的问题是,在C语言中,将ELF文件的内容读入缓冲区的正确方法是什么


谢谢。

读取二进制文件的正确方法就是使用
fread()
。但请记住,不能将内容视为字符串,这意味着(除其他外)不能使用
strlen()
来确定其长度


相反,必须将长度保留在单独的变量中。
fread()
的返回值将告诉您它成功读取了多少条记录-如果您将记录大小设置为1(第二个参数设置为
fread()
),那么它将返回读取的字节数。

处理ELF文件的最佳方法是使用ELF库(
libelf
;Google知道这一点),假设您可以使用它。ELF文件具有复杂的结构,并且库通常会使处理文件更容易

如果必须使用
fread()
,则只要您认识到数据中充满了空字节或零字节,并且由于数据中的零,普通字符串函数将无法准确处理数据,它就可以正常工作。特别是像
printf()
这样的函数在第一个零字节处停止打印字符串

要通过网络备份任意文件,只需打开该文件(以二进制模式;它在Unix上无害,在Windows上至关重要),然后将大数据块读入内存并再次写入:

/* Copy the rest of f1 to f2 */
void fcopy(FILE *f1, FILE *f2)
{
    char            buffer[BUFSIZ];
    size_t          n;

    while ((n = fread(buffer, sizeof(char), sizeof(buffer), f1)) > 0)
    {
        if (fwrite(buffer, sizeof(char), n, f2) != n)
            err_syserr("write failed\n");
    }
}

err\u syserr()
函数是一个简单的错误报告函数,它报告其参数中给出的错误,并添加系统错误消息(
strerror(errno)
)并退出。

听起来像是您以文本模式而不是二进制模式打开了文件。您可能阅读得很好,但我敢打赌你对结果使用的是字符串运算。字符串操作总是在看到null时退出。是否尝试过LibElf@cnicutar是的,我没有提到unix部分(elf文件暗示了这一点,即使没有说明),但如果您以文本模式打开并尝试读取值为0x1A的字节,fread肯定会在Windows上停止中流操作。@cnicutar在这里暗示了这一点,并在论坛(如)上进行了描述,但它很容易测试。我从来没有在任何地方看到过它,只是被它咬了够多次。