文件的捆绑与分解

2024-03-05 03:18
文章标签 分解 捆绑

本文主要是介绍文件的捆绑与分解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、文件捆绑

     

该方法只是实现文件二进制流的附加,并没有改变文件的结构。

      建立一个新的二进制文件,先写入第一个捆绑文件的数据和其文件长度,后再直接写入第二个文件的数据和文件长度……。注: 第一个捆绑文件代码这里执行分解文件的操作,则实现了当运行捆绑后的文件时,即把捆绑的文件分解出来,并运行,进行特定操作。而这里在首文件后的数据只是以二进制流的方式加在了首文件尾部,之后的程序并没有运行。

 

实现代码:

 

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
     // TODO: Place code here.
    ::mkdir(".//Result"); //创建目录
    FILE* result; // 合成后的主文件
    result = fopen(FILE_RESULT, "wb"); //创建最终合成文件
    if (result == NULL)
    {
        MessageBox(NULL,"创建绑定后生成的合成文件时出错!/n","错误",MB_OK);
        return false;
    }
    BindFile(result,MAIN_FILE0); // 捆绑分解代码文件 MAIN_FILE0

 

    BindFile(result,BIND_FILE1);
    BindFile(result,BIND_FILE2);
    BindFile(result,BIND_FILE3);
    BindFile(result,BIND_FILE4);
    BindFile(result,BIND_FILE5);

    fclose(result);

    return 0;
}

void BindFile(FILE* mainfile, char* filepath)
{

     struct _stat ST; //用于保存文件信息的结构体
     _stat(filepath, &ST);

     BYTE* buf;  //BYTE = unsigned char
     buf = (BYTE *)malloc(ST.st_size);  // 动态分配内存
     FILE* myself;
     myself = ::fopen(filepath,"rb");
     if(myself == NULL)
     MessageBox(NULL,"原文件打开失败!/n","错误",MB_OK);
     ::fread(buf, 1, ST.st_size, myself);  //读文件
     ::fwrite(buf, 1, ST.st_size, mainfile);  //写文件内容
     ::fwrite(&ST.st_size,1, sizeof(ST.st_size), mainfile);  // 写文件长度
     free(buf);
     fclose(myself);

}

     

二、文件分解

      将文件指针定位到捆绑文件的尾部,读取文件长度,再读取文件数据。。。

 

实现代码:

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here. 
    if(!PathFileExists("C://WINDOWS//system32//MyFile"))  
   ::mkdir("C://WINDOWS//system32//MyFile"); 

   struct _stat ST;
   _stat(FILE_RESULT, &ST);
   mainfile_length = ST.st_size;
   // cout<<"主文件长度字节数为:"<<mainfile_length<<endl;

   FILE* result;  //主文件指针
   result = fopen(FILE_RESULT, "rb");  //打开主文件
   if (result == NULL)
    {
         MessageBox(NULL,"打开自身文件时出错","ERROR",MB_OK);
         return 0;
    }

   UnBindFile(result, FILE1);

   UnBindFile(result, FILE2);
   UnBindFile(result, FILE3);
   UnBindFile(result, FILE4);
   UnBindFile(result, FILE5);
 

   fclose(result);
   ::ShellExecute(NULL,"open",FILE1,NULL,NULL,SW_SHOWNORMAL);
   return 0;
}


void UnBindFile(FILE* mainfile, char* filepath)
{

    long file_length = 0;

    FILE* myfile;  //分解文件
    myfile = fopen(filepath, "wb");
    if (myfile == NULL)
    {
        MessageBox(NULL,"创建第一个被绑定文件时出错","ERROR",MB_OK);
        return ;
    }
 
    //将文件指针定位到主程序最后一个储存长度信息的位置
    int temp = fseek(mainfile, mainfile_length - sizeof(file_length) , 0);  // #define SEEK_SET 0
   if (temp != 0)
   {  

         MessageBox(NULL,"定位文件长度位置指针出错","ERROR",MB_OK);

         return;

    }
   if(mainfile == NULL) 

   {
         MessageBox(NULL,"查找文件长度信息位置出错","ERROR",MB_OK);

         return;

   }
     //将文件长度信息储存在 file_length
   temp = fread(&file_length, sizeof(file_length), 1, mainfile);

   if (temp == 0)
   {
          MessageBox(NULL,"读取第一个被绑定文件长度时出错","ERROR",MB_OK);
          return ;
   }

    //读取文件内容
   BYTE* buf;
   buf = (BYTE*)malloc(file_length); //sizeof(buf) 结果为4
 //查找文件内容位置,储存在
 
  fseek(mainfile, ( mainfile_length - file_length - sizeof(file_length) ), 0);
  //读取文件内容
  fread(buf, 1, file_length, mainfile);
  //分解出文件
  fwrite(buf, 1, file_length, myfile);

  mainfile_length -= ( file_length + sizeof(file_length) ); //保存剩余文件长度

  free(buf);
  fclose(myfile);

}

 

 

这篇关于文件的捆绑与分解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775162

相关文章

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩 目录 前言 一、特征值分解 二、应用特征值分解对图片进行压缩 三、矩阵的奇异值分解 四、应用奇异值分解对图片进行压缩 五、MATLAB仿真代码 前言         学习了特征值分解和奇异值分解相关知识,发现其可以用于图片压缩,但网上没有找到相应代码,本文在学习了之后编写出了图片压缩的代码,发现奇异值分

连分数因子分解法——C语言实现

参考网址:连分数分解法寻找整数的因子(Python)-CSDN博客 大数运算:C语言实现 大数运算 加减乘除模运算 超详细_64编程 加减乘除取模 复杂运算-CSDN博客 ‌连分数因子分解法‌是一种用于大整数因子分解的算法,它是计算数论中的一个重要方法。连分数因子分解法通过寻找x2≡y2 (mod p)x2≡y2 (mod p)的形式来分解N。具体来说,这种方法涉及到计算N的简单连分数展开,并

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解(VMD)2. 双向时域卷积(BiTCN)3. 双向门控单元(BiGRU)4. 注意力机制(Attention)总结流程 二、实验结果三、核心代码四、代码获取五、总结 时序预测|变分模态分解-双向时域卷积

《机器学习》 基于SVD的矩阵分解 推导、案例实现

目录 一、SVD奇异值分解 1、什么是SVD 2、SVD的应用         1)数据降维         2)推荐算法         3)自然语言处理 3、核心         1)什么是酉矩阵         2)什么是对角矩阵 4、分解过程 二、推导 1、如何求解这三个矩阵         1)已知:          2)根据酉矩阵的特点即可得出:

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i

等式(数论/唯一分解定理)

链接: https://www.nowcoder.com/acm/contest/90/F 来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数) 输入描述: 在第一行输入一个正整数T。接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。(1<=n<=1e9) 输出描述: 输出符合该方程要求的解数。

【SGU】113. Nearly prime numbers 合数分解

传送门:【SGU】113. Nearly prime numbers 题目分析:O(sqrt(N))。。 代码如下: #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;#define rep( i , a , b ) for

基于Python的机器学习系列(23):奇异值分解(SVD)

在本篇中,我们将介绍如何利用奇异值分解(SVD)进行降维。SVD 是一种强大的矩阵分解方法,可以帮助我们提取数据中的重要特征,广泛应用于数据分析、图像处理等领域。 问题定义         在数据分析中,特别是当数据维度很高时,我们经常需要减少数据的维度以便于处理和可视化。奇异值分解(SVD)提供了一种有效的方法来实现这一目标。SVD 通过将原始数据矩阵分解成三个矩阵的乘积,从

Pollard‘s rho因子分解法——C语言实现

Pollard's rho的核心思想其实就是求p和q的倍数,而这样的倍数有无穷多个,当N值很小的时候,成功率还是很高的,当N值很大时,该算法就不灵了。 #include <stdio.h>#include <stdlib.h>int gcd(int x,int y){int z;while(y){z=x,x=y,y=z%y;}return x;}int f(int x,int c,i

特征值分解(EVD)和奇异值分解(SVD)

两篇博文,写得很好: http://blog.sina.com.cn/s/blog_3f738ee00102val0.html http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html