文件打包学习

文件打包学习(1)

打包的定义

  什么是打包?打包这个词很形象,就是把零碎的文件进行统一重封装,统一管理,比如我们常见的RAR文件,ZIP文件都是很常见的包裹格式

打包的意义

  1. 比如RAR包,我们虽然能有工具解压,但是我们却基本上没有相关的SDK来做二次开发
  2. ZIP包虽然有SDK来读取,但是对于通用的文件格式,我们无法做到保护资源的需求
  3. 如果只是为了文件管理的方便,无所谓别人解开资源的话,直接用现成的ZIP开发的SDK即可

打包的方式

  • 分类打包
    比如图片资源打一个包,声音资源打一个包
  • 全部打包
    把所有资源一起打包

打包的一般准则和规范

  1. 原始文件的标识,这个标识可以使原始文件名+路径名,或者也可以是转换后的数据如ID等,先从最简单的说起,使用原始文件名+路径名
  2. 原始文件的大小,把文件打进包裹之后,我们要知道这个原始文件有多大
  3. 原始文件的数据打包在包裹的什么位置

打包程序的实现框架

  1. 包裹文件的定义
  2. 添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数
  3. CreatePackage(创建空白包裹)函数的实现
  4. AddFileToPackage(添加一个文件到包裹)函数的实现

文件打包学习(2)

之前存在的缺点

  1. PackageItem结构中文件名是char fileName[256];浪费内存
  2. 解包与打包是不同的程序
  3. 增加可操作性,实现内存文件流
  4. 设计一个简短的、高效的二进制的文件格式用于打包操作

程序设计流程

  1. 添加CNewPackage类
  2. 添加并实现CFileBuffer类
  3. 定义一个新的NewPackageItem结构体
  4. 添加CNewPackage类的接口
  5. 实现CNewPackage构造函数和析构函数
  6. 实现ResetPackage函数
  7. 实现RemoveFile函数
  8. 实现HasFile函数
  9. 实现AddFile函数
  10. 实现SavePackage函数
  11. 定义FileItemForWrite结构体
  12. 实现OpenPackage函数
  13. ExportPackageItem函数
  14. 测试Package3程序

文件打包学习(3)

之前存在的弱点

  1. 文件虽然打包成一个文件,但是对于打包后的文件内容依然是明文的,不安全

常用加密算法

  • AES
    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用
    的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

  • XOR加密
    同一值去异或两次就可以恢复出原来的值,因此它是最简单的可逆的操作,也是最简单的加密算法

  • 自定义算法

文件打包学习(4)

添加自定义加密方法

文件打包学习(5)

存在的问题

  1. 被打包的文件只是按照我们的格式放入到一个包裹中,没有真正的压缩

压缩文件设计

  1. 根据文件的大小进行分段压缩
  2. 先获取这个文件最大可以压缩到多少字节
  3. 根据获取到的最大可以压缩的字节数申请内存
  4. 对原文件进行压缩,得到压缩后的实际字节数
  5. 记录文件压缩前后的大小
  6. 将记录文件压缩信息的结构写入包裹
  7. 将压缩后的文件数据写入包裹
  8. 更新文件在包裹中的偏移信息

解压

  1. 根据读取的PackageItem中文件的大小申请内存
  2. 先读取包裹中文件压缩信息的结构
  3. 根据读取到的压缩后的文件的大小分配内存
  4. 读取压缩后的数据到分配的内存中
  5. 解压缩 读取到的压缩数据到filebuffer中
  6. 循环读,直到拼接一个完成的文件

文件打包学习(6)

对文件的每一个块进行CRC32校验

保存文件

  1. 在每个packageItem前加入CRC32空间
  2. 在写入索引的时候,先计算packageItem的CRC32值
  3. 将CRC32写入包裹中,再写入packageItem
  4. 计算BlockInfo的CRC32
  5. 根据算出的BlockInfo的CRC32,再次对压缩后的数据进行CRC32计算
  6. 将CRC32写入包裹中,再写入BlockInfo,再写入压缩后的数据

读取文件

  1. 读取packageItem前的CRC32值
  2. 读取packageItem,计算读取的packageItem的CRC32
  3. 判断之前存放的CRC32是否与当前计算的一致

导出文件

  1. 读取blockInfo前的CRC32
  2. 读取blockInfo并计算CRC32
  3. 读取压缩后的数据,根据上一步算出的CRC32再次计算压缩后数据的CRC32
  4. 判断之前存放的CRC32是否与当前计算的一致
posted @ 2019-11-24 17:27  sfdevs  阅读(361)  评论(0)    收藏  举报