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 ...
随机推荐
- 【Android UI】侧滑栏的使用(HorizontalScrollView控件的使用)
主要的用到的控件:HorizontalScrollView 主要的功能:把几张图片解析成一张图片,在一个容器中呈现. 布局文件xml side_bar_scollview.xml//显示view的容器 ...
- 从微信小程序开发者工具源码看实现原理(二)- - 小程序技术实现
wxml与wxss的转换 1.wxml使用wcc转换 2.wxss使用wcsc转换 开发者工具主入口 视图层页面的实现 视图层页面实现技术细节 视图层快速打开原理 视图层新打开页面流程 业务逻辑层页面 ...
- C#2.0新增功能06 协变和逆变
连载目录 [已更新最新开发文章,点击查看详细] 在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反. 以下代码演示分配兼容性.协 ...
- 基于python图片识别工具(图片识别,车牌,PDF,验证码)
先上图 不多说. 对于一般的用户来说识别率还是能达到百分之90以上. 已经打包成exe文件.windows用户可以直接使用.要软件的加我QQ python代码: # -*- coding: UTF- ...
- 在Ubuntu中安装Docker和docker的使用
1.在Ubuntu中安装Docker 更新ubuntu的apt源索引 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo apt-get install \ ap ...
- springboot整合mybatis时无法读取xml文件解决方法(必读)
转 http://baijiahao.baidu.com/s?id=1588136004120071836&wfr=spider&for=pc 在springboot整合myba ...
- 消费端如何保证消息队列MQ的有序消费
消息无序产生的原因 消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端(Consumer) ...
- python3键盘输入
1.脚本 # -*- coding: utf-8 -*- print("今年是哪一年?"),year = input("年份:")print ("ji ...
- 终极CRUD-2-用lombok提高开发效率
目录 1 lom介绍与基本使用 2 lombok 注意点 2.1 lombok自动生成方法可以混合自己写的方法 2.2 尽量不要使用@Data 2.3 属性不要使用基本类型 2.4 小心@ToStri ...
- 【Spring】The matching wildcard is strict……
applicationContext.xml 文件抛出了这个异常信息. 解决方法: 需要在 namespace 后加上对应的 schemaLocation,如下所示: <?xml version ...