pak文件的打包和解包
pak格式的文件 一般游戏有资源 游戏素材会打包放进去
比如游戏语音 游戏多加点语音 多加一些贴图资源
外部文件实现的
素材--->pak文件--->用的时候从文件中取出来
文件的打包
#include<iostream>
#include<fstream>//观于文件的头函数
using namespace std; struct fileInfo
{
int fileSize;//文件大小
int fileOff;//文件在pak中的偏移
int fileNameSize;//文件名的长度
char* fileName;//文件名
};
int main()
{
fileInfo pic[] = { { , , , "背景.jpg" }, { , , , "人物.jpg" }, { , , , "箱子.jpg" }, { , , , "目的地.jpg" } };
//初始化结构体 给结构体内存放数据
int listNum = , listSize = ; fstream resFile[];//源文件
fstream srcFile;//打包之后的文件
for (int i = ; i < ; i++)
{
resFile[i].open(pic[i].fileName, ios::in | ios::binary);//打开文件 文本或二进制文件
resFile[i].seekg(, ios::end);//将文件指针移动到文件末尾end
pic[i].fileSize = resFile[i].tellg();//得到文件的大小tellg
pic[i].fileNameSize = strlen(pic[i].fileName);//求文件名长度
listSize += + + + pic[i].fileNameSize;//加上单条索引表的长度
// 文件大小4 +文件偏移量4+ 文件名大小4 +文件名长度
}
for (int i = ; i < ; ++i)
{
if (i == )//第一个文件
{
pic[i].fileOff = listSize;//第一个文件的偏移量就是索引表大小
}
else
{
pic[i].fileOff = pic[i - ].fileOff + pic[i - ].fileSize;
//计算后面的文件偏移量
}
}
srcFile.open("new.pak", ios::out | ios::binary);//准备写入文件 srcFile.write((char*)&listSize, sizeof(int));//写入索引表的大小和索引表的个数
srcFile.write((char*)&listNum, sizeof(int)); for (int i = ; i < ; ++i)//写索引表
{
srcFile.write((char*)&pic[i].fileSize, sizeof(int));
srcFile.write((char*)&pic[i].fileOff, sizeof(int));
srcFile.write((char*)&pic[i].fileNameSize, sizeof(int));
srcFile.write(pic[i].fileName, pic[i].fileNameSize);
} for (int i = ; i < ; ++i)//写入文件内容
{
resFile[i].seekg(, ios::beg);//将文件指针移动到文件开头
while (!resFile[i].eof())//写文件
{
srcFile.put(resFile[i].get());
}
srcFile.seekp(-, ios::cur);//删掉一个字节 避免多写入数据
resFile[i].close();//写完关闭
} srcFile.close(); cin.get();
return ;
}
//运行后将文件打包到new.pak中
文件的解包
#include<iostream>
#include<fstream>
using namespace std; struct fileInfo
{
int fileSize;//文件大小
int fileOff;//文件在pak中的偏移
int fileNameSize;//文件名的长度
char fileName[];//文件名
}; int main()
{
fstream file;
file.open("new.pak", ios::in | ios::binary);//读取文件
fileInfo pic[];//写文件的时候大小可能不止四个
int listSize, listNum;// Num是索引表的个数 file.read((char*)&listSize, sizeof(int));//读到索引表的大小
file.read((char*)&listNum, sizeof(int)); //读取每条索引的内容
for (int i = ; i < listNum; ++i)
{
file.read((char*)&pic[i].fileSize, sizeof(int));
file.read((char*)&pic[i].fileOff, sizeof(int));
file.read((char*)&pic[i].fileNameSize, sizeof(int));
file.read(pic[i].fileName, pic[i].fileNameSize);//需要注意\0
pic[i].fileName[pic[i].fileNameSize] = '\0';
cout << i << "个文件的内容------------------" << endl;
cout << pic[i].fileSize << endl;
cout << pic[i].fileOff << endl;
cout << pic[i].fileNameSize << endl;
cout << pic[i].fileName << endl;
}
fstream res[];//大小其实用vector或者new好一点 listNum //前面有文件大小和文件偏移量 如果读取特定的文件 可以直接用索引中的大小和偏移量读取
for (int i = ; i < listNum; ++i)
{
res[i].open(pic[i].fileName, ios::out | ios::binary);
for (int j = ; j < pic[i].fileSize; ++j)
{
res[i].put(file.get());
}
res[i].close();
} file.close();//关闭文件
cin.get();
return ;
}
//运行exe文件将图片文件解包
pak文件的打包和解包的更多相关文章
- [android]system.img文件的打包和解包
1:system.img的两种格式 system2_0.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-94 ...
- python中*和**的打包和解包
python中的*和**,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量arg ...
- unity学习 5.x依赖打包和解包
unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的assetBundleName 2.BuildPipeline.BuildAssetBundles,指定资源 ...
- xpack文件打包解包代码库
Github ###概述 xpack是一个文件资源打包工具及类库,可以对多文件进行打包解包. 其使用文件名的hash作为索引,建立hash索引表以加速文件查找. ###特性 支持hashid自动解冲突 ...
- Day004_Linux基础_基础命令之tar打包解包
基础命令之 打包,和解包. tar zcvf 打包的参数 tar zcvf /tmp/etc.tar.gz /etc 将/etc/下的文件压缩成一个压缩包 z 通过gzip工具进行压缩 c 表示 ...
- Linux 文件的打包压缩
压缩和解压 压缩:为了节约磁盘空间. gzip --- .gz bzip2 --- .bz2 xz --- .xz compress --- .z 压缩比例:xz > bzip2 > gz ...
- Android将Activity 打 jar包 (解决资源文件不能打包的问题)
转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...
- Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...
- 【转】Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法) 鼠标右键项目,然后属性,然后java buildpath 然后order and ex ...
随机推荐
- Ansible配置文件ansible.cfg详解
Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 此时外面小雨淅淅沥沥 ...
- 网页学习:day1
初始准备: Write some function Write a titie Write a article Write some button Button function写法: functio ...
- 如何在windows上玩转redis的最新特性?
想要了解redis的最新特性,可是windows下的可以安装的版本最高为3.2,想要验证redis的诸如stream特性的话,就无能为力了. 解决方法之一在windows上安装虚拟机,然后再虚拟机上安 ...
- SPC 数据分析工具
趁着公司在做QMS软件,自己实现一个简易版,类似minitab的工具. 环境:.net framework 4.0 目前提供功能: 数据存储,载入 计量型控制图:单值移动极差图.均值极差图.均值标准差 ...
- mybatis-Generator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap
原因: 如果不把之前已经生成的xxxMapper.xml删除掉,再次生成代码时,会附加上去! 运行项目就回报上面的错误. 所以在运行代码生成之前,要把以前已经生成的xml文件清掉,以妨出错.
- JSTL和EL简介
EL Expression Language,表达式语言,通过操作存在于PageContext等的数据,实现JSP的编写更加简单,单纯使用EL不用引入jar包,只要容器支持即可. EL的隐含对象 EL ...
- 【Android】INSTALL_FAILED_UPDATE_INCOMPATIBLE
多是因为已经安装过该 apk 文件了,一般卸载了重新运行就 OK 了.
- Lexical or preprocessor 'XXX/XXX.h' issue file not found
最近做第三方登录,引入了第三库,结果就出来个这个问题.如下图所示: 刚开始编译运行都没问题,可下次再打开时就报这个错误…… 一个比较弱智的解决办法: 1. 删除第三方库文件(删除到垃圾箱,而且还要在文 ...
- 手把手教你grid布局
概述 目前css布局方案中,网格布局可以算得上是最强大的布局方案了.它可以将网页分为一个个网格,然后利用这些网格组合做出各种各样的布局. 基本概念 在学习grid布局之前,我们需要了解一些基本概念 1 ...
- S2:面向对象
面向对象七大设计原则 1. 开闭原则 2. 里氏替换原则 3. 单一职责原则 4. 接口隔离原则 5. 依赖倒置原则 6. 迪米特原则 7.组合/聚合复用原则 原则一:(SRP:Single resp ...