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

时间:2011-07-01 23:03:22

标签: c elf fread

第一次在这里发帖,用Google搜索了几个小时,我找不到任何东西。

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

到目前为止,我已经使用fread()将文件放入缓冲区,其方式与此类似: http://www.cplusplus.com/reference/clibrary/cstdio/fread/

它适用于纯文本文件,但是当我尝试传输可执行文件时,fread()似乎没有读取文件,只是将“ELF”读入缓冲区。

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

谢谢。

2 个答案:

答案 0 :(得分:2)

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

如果你必须使用fread(),那么只要你认识到数据充满了空或零字节并且普通的字符串函数不能准确地处理数据,因为它会使用printf()。数据。特别是,像/* 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"); } } 这样的函数会在第一个零字节处停止打印字符串。

要通过网络备份任意文件,您只需打开文件(在二进制模式下;它对Unix没有任何害处,在Windows上至关重要),并将大块读入内存并再次写出来:< / p>

err_syserr()

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

答案 1 :(得分:0)

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

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