qq_43396784 2021-08-24 20:40 采纳率: 60%
浏览 31

二进制文件尾补0,不会影响二进制文件吗?

昨天在学习linux里的文件IO时遇到一个问题,我不太懂想请大家指教指教,昨天教师布置了一个任务用文件IO完成一个简单的cp 命令,要求是可以拷贝二进制文件,下面是我的代码。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

#define NUM 100
                                                                                                                                                  
int main(int argc, const char  *argv[])
{

    if (1 == argc)
    {   
        printf("please input source file name to copy\n");
        return -1; 
    }   
    if (2 == argc)
    {   
        printf("please input destination file name\n");
        return -1; 
    }   

    int fd1 = open(argv[1], O_RDONLY);
    int fd2 = open(argv[2], O_WRONLY|O_CREAT|O_EXCL, 0764);

    char wr_name[30] = {0};
    if (-1 == fd2)
    {   
        perror(argv[2]);
        return -1; 
    }   

    char buf[NUM];

    while (0 != read(fd1, buf, NUM))
    {   
        write(fd2, buf, NUM);
        memset(buf, 0, NUM);
    }   

    close(fd1);
    close(fd2);
    
    return 0;
}

代码是可以实现教师说的任务的,但我又一个地方不太理解,就是在write()这个函数这里,由于我把write的第三个参数写死了,所以在buf里的大小不足NUM也就是100时,会向文件中写入readi()读到的内容,然后会在后面写入若干个二进制的0直到够write()中写的NUM的个数,那么当我用这个可执行文件去拷贝二进制文件时,拷贝后的文件一定是大于源文件的,我不理解的是为什么拷贝后的文件可以像源二进制文件一样可以运行、查看,我觉的应该会出现错误的,难道在二进制文件的末尾补0,对二进制文件没有影响吗?为什么会这样呢?

  • 写回答

1条回答 默认 最新

  • 卧龙派 2021-08-27 11:53
    关注

    linux的文件格式不太熟悉,不过按照win下的PE文件来说,不管你在文件末尾补多少个0或者其他数据,只要不破坏PE原有格式,都没问题。

    因为PE文件是按照各个节存储的,程序在加载的时候也是根据节表结构来的。你在后面补的数据,操作系统直接无视了。除非是你把自己加的这部分数据当做一个节,当然前提是你要修复节表。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月24日

悬赏问题

  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线