zoukankan      html  css  js  c++  java
  • ~~~二进制文件操作~~~

    有这样一个二进制文件,大小在100M左右,里面存放了多张JPG图片,文件格式如下:

    无关数据区
    JPG图片数据区
    无关数据区
    JPG图片数据区
    无关数据区
    JPG图片数据区
    ......

    已知JPG图片起始标志为:“FF D8 FF E0 00 10 4A”,结束标志为:“FF D9”。

    现想把这些JPG图片数据从该文件中读出来,生成一个个单独的图片文件,该如何做呢?

    帮你写了个程序, 测试了只含有一个图片信息的文件
    int len=0;
    int filesn=0;

    void ReadJpg(CFile *sfp,const char *dstfile,unsigned char a,unsigned char b)
    {

    CFile nf;
    nf.Open(dstfile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
    unsigned t=0,t1=0;
    nf.Write(&a,sizeof(char));
    nf.Write(&b,sizeof(char));
    while(1)
    {
    sfp->Read(&t,sizeof(char));
    len++;
    nf.Write(&t,sizeof(char));
    if(t==0xFF)
    {
    sfp->Read(&t1,sizeof(char));
    len++;
    if(t1==0xD9)
    break;
    else
    nf.Write(&t1,sizeof(char));

    }

    }

    nf.Close();
    }


    调用:

    void test()
    {

    CFile fp;
    fp.Open("86b05621.jpg",CFile::modeRead|CFile::typeBinary);//文件名改一下
        unsigned char a=0,b=0;
     len=0;

    while(1)
    {
    fp.Read(&a,sizeof(char));
    len++;
    if(len>=fp.GetLength())
    break;

    if(a==0xFF)
    {

    fp.Read(&b,sizeof(char));
    len++;
    if(b==0xD8)
    {
    filesn++;
    char filename[256];
    sprintf(filename,"Jpg %d.jpg",filesn);
    ReadJpg(&fp,filename,a,b);
    }
    }

    }
    fp.Close();
    }

    思路是,先得到FF的值,然后再判断下一位是否是0xD8, 但这里要说明一下,如果你的其它数据信息里也含有FF D8值的话就会出错了, 所以为保险起见,应该再多比较几位, JPG的头是固定的,再往下就是EF E0 00 1E, 建议楼主再往下比较四位比较保险(在程序中稍作修改即可)

    你是不是在 分析某个 游戏的或程序的资源文件呀,如果是的话,这个资源文件应该配有一个 索引文件!或在其文件自身。索引可以列表索引,链表形示……
    如果是你自已生成的文件包,最好加上索引,因为这样可以提高效率! 

  • 相关阅读:
    国家语言,语言代码,locale id对应表
    SpringMVC,SpringBoot文件下载
    lombok使用基础教程
    博客园主题修改中用到的css属性
    Hexo next博客添加折叠块功能添加折叠代码块
    IntelIj IDEA运行JUnit Test OutOfMemoryError
    Spring Boot-JPA、Hibernate、Spring data jpa之间的关系
    IntelliJ IDEA-设置字体大小
    win10-mysql卸载干净
    IntelliJ IDEA Check out from git
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9410209.html
Copyright © 2011-2022 走看看