文件打包学习
文件打包学习(1)
打包的定义
什么是打包?打包这个词很形象,就是把零碎的文件进行统一重封装,统一管理,比如我们常见的RAR文件,ZIP文件都是很常见的包裹格式
打包的意义
- 比如RAR包,我们虽然能有工具解压,但是我们却基本上没有相关的SDK来做二次开发
- ZIP包虽然有SDK来读取,但是对于通用的文件格式,我们无法做到保护资源的需求
- 如果只是为了文件管理的方便,无所谓别人解开资源的话,直接用现成的ZIP开发的SDK即可
打包的方式
- 分类打包
比如图片资源打一个包,声音资源打一个包 - 全部打包
把所有资源一起打包
打包的一般准则和规范
- 原始文件的标识,这个标识可以使原始文件名+路径名,或者也可以是转换后的数据如ID等,先从最简单的说起,使用原始文件名+路径名
- 原始文件的大小,把文件打进包裹之后,我们要知道这个原始文件有多大
- 原始文件的数据打包在包裹的什么位置
打包程序的实现框架
- 包裹文件的定义
- 添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数
- CreatePackage(创建空白包裹)函数的实现
- AddFileToPackage(添加一个文件到包裹)函数的实现
文件打包学习(2)
之前存在的缺点
- PackageItem结构中文件名是char fileName[256];浪费内存
- 解包与打包是不同的程序
- 增加可操作性,实现内存文件流
- 设计一个简短的、高效的二进制的文件格式用于打包操作
程序设计流程
- 添加CNewPackage类
- 添加并实现CFileBuffer类
- 定义一个新的NewPackageItem结构体
- 添加CNewPackage类的接口
- 实现CNewPackage构造函数和析构函数
- 实现ResetPackage函数
- 实现RemoveFile函数
- 实现HasFile函数
- 实现AddFile函数
- 实现SavePackage函数
- 定义FileItemForWrite结构体
- 实现OpenPackage函数
- ExportPackageItem函数
- 测试Package3程序
文件打包学习(3)
之前存在的弱点
- 文件虽然打包成一个文件,但是对于打包后的文件内容依然是明文的,不安全
常用加密算法
-
AES
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用
的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。 -
XOR加密
同一值去异或两次就可以恢复出原来的值,因此它是最简单的可逆的操作,也是最简单的加密算法 -
自定义算法
文件打包学习(4)
添加自定义加密方法
文件打包学习(5)
存在的问题
- 被打包的文件只是按照我们的格式放入到一个包裹中,没有真正的压缩
压缩文件设计
- 根据文件的大小进行分段压缩
- 先获取这个文件最大可以压缩到多少字节
- 根据获取到的最大可以压缩的字节数申请内存
- 对原文件进行压缩,得到压缩后的实际字节数
- 记录文件压缩前后的大小
- 将记录文件压缩信息的结构写入包裹
- 将压缩后的文件数据写入包裹
- 更新文件在包裹中的偏移信息
解压
- 根据读取的PackageItem中文件的大小申请内存
- 先读取包裹中文件压缩信息的结构
- 根据读取到的压缩后的文件的大小分配内存
- 读取压缩后的数据到分配的内存中
- 解压缩 读取到的压缩数据到filebuffer中
- 循环读,直到拼接一个完成的文件
文件打包学习(6)
对文件的每一个块进行CRC32校验
保存文件
- 在每个packageItem前加入CRC32空间
- 在写入索引的时候,先计算packageItem的CRC32值
- 将CRC32写入包裹中,再写入packageItem
- 计算BlockInfo的CRC32
- 根据算出的BlockInfo的CRC32,再次对压缩后的数据进行CRC32计算
- 将CRC32写入包裹中,再写入BlockInfo,再写入压缩后的数据
读取文件
- 读取packageItem前的CRC32值
- 读取packageItem,计算读取的packageItem的CRC32
- 判断之前存放的CRC32是否与当前计算的一致
导出文件
- 读取blockInfo前的CRC32
- 读取blockInfo并计算CRC32
- 读取压缩后的数据,根据上一步算出的CRC32再次计算压缩后数据的CRC32
- 判断之前存放的CRC32是否与当前计算的一致