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 ...
随机推荐
- UVA-10608 Friends 【并查集】
There is a town with N citizens. It is known that some pairs of people are friends. According to the ...
- python面向过程编程 - ATM
前面程序整合加自定义日志 1.文件摆放 ├── xxxx │ ├── src.py │ └── fil_mode.py │ └── data_time.py │ └── loading.py │ └─ ...
- (图文教程)IntelliJ IDEA 导入Eclipse/MyEclipse 项目 配置详解+快捷键分享
(图文教程)IntelliJ IDEA 导入Eclipse/MyEclipse 项目 配置详解+快捷键分享 IntelliJ IDEA 使用教程.快捷键配置. 该教程针对原始jar包依赖的工程.mav ...
- 关于Object.defineProperty 的基础知识
Object.defineProperty 这个方法大家耳熟能详,可以对 对象的属性进行添加或修改的操作.即可以进行 数据劫持 .vue就是通过这个方法来劫持数据的. 平时我们创建对象的时候,一般通 ...
- 如何优雅关闭 Spring Boot 应用
## 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理 ...
- 《VR入门系列教程》之21---使用Unity开发GearVR应用
使用Unity开发GearVR应用 上一章我们介绍了如何运用Unity3D开发Oculus Rift应用,当然,这个便宜且强大的游戏引擎也可以用于GearVR的应用开发,这时我们需要用到Ocu ...
- 自动化部署方案CICD
自动化部署方案 由于来来也的时间不久,可能对现有的部署情况不是很了解,以下是个人对POC自动化部署的设计方案. 自动化部署优点 降低成本,提高生产力,高可用,更可靠,性能优化 与gitlab持 ...
- Webpack 下使用 web workers 及 基本原理 和 应用场景
_ 阅读目录 一:web workers的基本原理 二:web Workers 的基本用法 三:在webpack中配置 Web Workers 四:Web Worker的应用场景 回到顶部 一:web ...
- Jenkins-slave实现并行的自动化测试
前言 上篇文章搭建了Jenkins-slave的分布式测试环境,我一直在想一个问题,使用这种模式能不能实现并发的自动化测试?我的想法是:同一套UI自动化的测试代码,是否能够通过一个Job绑定多个sla ...
- 【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?
一.引子 一般在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题.交流游戏心得等.那么为了增加玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下可以直接拉起手Q加群的操作,加了Q ...