pak文件的打包和解包

pak格式的文件 一般游戏有资源 游戏素材会打包放进去

比如游戏语音 游戏多加点语音  多加一些贴图资源

外部文件实现的

素材--->pak文件--->用的时候从文件中取出来

文件的打包

 1 #include<iostream>
 2 #include<fstream>//观于文件的头函数
 3 using namespace std;
 4
 5 struct fileInfo
 6 {
 7     int fileSize;//文件大小
 8     int fileOff;//文件在pak中的偏移
 9     int fileNameSize;//文件名的长度
10     char* fileName;//文件名
11 };
12 int main()
13 {
14     fileInfo pic[4] = { { 0, 0, 0, "背景.jpg" }, { 0, 0, 0, "人物.jpg" }, { 0, 0, 0, "箱子.jpg" }, { 0, 0, 0, "目的地.jpg" } };
15     //初始化结构体 给结构体内存放数据
16     int listNum = 4, listSize = 8;
17
18     fstream resFile[4];//源文件
19     fstream srcFile;//打包之后的文件
20     for (int i = 0; i < 4; i++)
21     {
22         resFile[i].open(pic[i].fileName, ios::in | ios::binary);//打开文件 文本或二进制文件
23         resFile[i].seekg(0, ios::end);//将文件指针移动到文件末尾end
24         pic[i].fileSize = resFile[i].tellg();//得到文件的大小tellg
25         pic[i].fileNameSize = strlen(pic[i].fileName);//求文件名长度
26         listSize += 4 + 4 + 4 + pic[i].fileNameSize;//加上单条索引表的长度
27         // 文件大小4  +文件偏移量4+ 文件名大小4 +文件名长度
28     }
29     for (int i = 0; i < 4; ++i)
30     {
31         if (i == 0)//第一个文件
32         {
33             pic[i].fileOff = listSize;//第一个文件的偏移量就是索引表大小
34         }
35         else
36         {
37             pic[i].fileOff = pic[i - 1].fileOff + pic[i - 1].fileSize;
38             //计算后面的文件偏移量
39         }
40     }
41     srcFile.open("new.pak", ios::out | ios::binary);//准备写入文件
42
43     srcFile.write((char*)&listSize, sizeof(int));//写入索引表的大小和索引表的个数
44     srcFile.write((char*)&listNum, sizeof(int));
45
46     for (int i = 0; i < 4; ++i)//写索引表
47     {
48         srcFile.write((char*)&pic[i].fileSize, sizeof(int));
49         srcFile.write((char*)&pic[i].fileOff, sizeof(int));
50         srcFile.write((char*)&pic[i].fileNameSize, sizeof(int));
51         srcFile.write(pic[i].fileName, pic[i].fileNameSize);
52     }
53
54     for (int i = 0; i < 4; ++i)//写入文件内容
55     {
56         resFile[i].seekg(0, ios::beg);//将文件指针移动到文件开头
57         while (!resFile[i].eof())//写文件
58         {
59             srcFile.put(resFile[i].get());
60         }
61         srcFile.seekp(-1, ios::cur);//删掉一个字节  避免多写入数据
62         resFile[i].close();//写完关闭
63     }
64
65     srcFile.close();
66
67
68     cin.get();
69     return 0;
70 }

//运行后将文件打包到new.pak中

文件的解包

 1 #include<iostream>
 2 #include<fstream>
 3 using namespace std;
 4
 5 struct fileInfo
 6 {
 7     int fileSize;//文件大小
 8     int fileOff;//文件在pak中的偏移
 9     int fileNameSize;//文件名的长度
10     char fileName[128];//文件名
11 };
12
13
14 int main()
15 {
16     fstream file;
17     file.open("new.pak", ios::in | ios::binary);//读取文件
18     fileInfo pic[4];//写文件的时候大小可能不止四个
19     int listSize, listNum;// Num是索引表的个数
20
21     file.read((char*)&listSize, sizeof(int));//读到索引表的大小
22     file.read((char*)&listNum, sizeof(int));
23
24     //读取每条索引的内容
25     for (int i = 0; i < listNum; ++i)
26     {
27         file.read((char*)&pic[i].fileSize, sizeof(int));
28         file.read((char*)&pic[i].fileOff, sizeof(int));
29         file.read((char*)&pic[i].fileNameSize, sizeof(int));
30         file.read(pic[i].fileName, pic[i].fileNameSize);//需要注意\0
31         pic[i].fileName[pic[i].fileNameSize] = ‘\0‘;
32         cout << i << "个文件的内容------------------" << endl;
33         cout << pic[i].fileSize << endl;
34         cout << pic[i].fileOff << endl;
35         cout << pic[i].fileNameSize << endl;
36         cout << pic[i].fileName << endl;
37     }
38     fstream res[4];//大小其实用vector或者new好一点   listNum
39
40
41     //前面有文件大小和文件偏移量  如果读取特定的文件 可以直接用索引中的大小和偏移量读取
42     for (int i = 0; i < listNum; ++i)
43     {
44         res[i].open(pic[i].fileName, ios::out | ios::binary);
45         for (int j = 0; j < pic[i].fileSize; ++j)
46         {
47             res[i].put(file.get());
48         }
49         res[i].close();
50     }
51
52
53     file.close();//关闭文件
54     cin.get();
55     return 0;
56 }

//运行exe文件将图片文件解包

原文地址:https://www.cnblogs.com/liugangjiayou/p/11388142.html

时间: 2024-08-29 06:31:12

pak文件的打包和解包的相关文章

[android]system.img文件的打包和解包

1:system.img的两种格式 system2_0.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files) system1_0.img: Android sparse image, version: 1.0, Total of 393216 4096-byte output blocks in 1765 input chunks. 以上

python中*和**的打包和解包

python中的*和**,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量args >>> def f(*args): print(args) >>> f() () >>> f(1) (1,) >>> f(1, 2, 3, 4) (1, 2, 3, 4) >>> ** 的作用:在函数定义中,收集关键

unity学习 5.x依赖打包和解包

unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的assetBundleName 2.BuildPipeline.BuildAssetBundles,指定资源目录和压缩类型 生成: 1.Assetbundle文件,加载时的首要文件,包含所有资源的依赖信息 2.每个文件对应一个.manifest,不用管他,但是可以打开查看他引用了哪些资源. 加载: 1.获取AssetBundle文件 2.LoadAsset("AssetBundleManifest&quo

文件的打包和解压-----常用

<17>归档管理:tar 计算机中的数据经常需要备份,tar是Unix/Linux中最常用的备份工具,此命令可以把一系列文件归档到一个大文件中,也可以把档案文件解开以恢复数据. tar使用格式 tar [参数] 打包文件名 文件 tar命令很特殊,其参数前面可以使用"-",也可以不使用. 常用参数: 参数 含义 -c 生成档案文件,创建打包文件 -v 列出归档解档的详细过程,显示进度 -f 指定档案文件名称,f后面一定是.tar文件,所以必须放选项最后 -t 列出档案中包含

xpack文件打包解包代码库

Github ###概述 xpack是一个文件资源打包工具及类库,可以对多文件进行打包解包. 其使用文件名的hash作为索引,建立hash索引表以加速文件查找. ###特性 支持hashid自动解冲突,即使添加的多个文件名hashid发生冲突也可以正常存取,不用担心文件名hash一样导致的添加失败问题 支持存储文件的原文件名,可以解包复原文件目录结构 支持文件分块存储,可以重复利用被删除文件的剩下的空闲块,提高资源包的空间利用率,提高资源删除的性能 支持寄生资源包,可以把资源包追加到其他文件中,

linux下的文件打包和解压

文件的打包压缩 gzip     (后缀.gz     不能压缩目录,压缩完后源文件会消失) 使用方法: gzip -1 1.txt     (压缩1.txt文件压缩比例最小压缩速度最快) gzip -9 1.txt     (压缩1.txt文件压缩比例最大,压缩速度最快) gzip -d 1.txt.gz     (对1.txt的压缩包进行解压缩) bzip2     (后缀.bz2     不能压缩目录,压缩完后源文件会消失 ) 使用方法: bzip2 -1 1.txt     (压缩1.t

Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来替换里面的资源图片,文字等一些资源文件问题,我本来想这个简单,用两个工程直接替换里面的资源文件就行,老大说,这样子不好,如果要改需要改两个客户端,而且还麻烦,叫我将所有的Activity打成Jar包的形式,这样子我们改了里面的内容就直接发布Jar包出去,其他公司直接下载Jar来使用,这样子他们自己公

CentOS打包和解压详解

一.压缩和解压介绍 Linux下最常用的打包命令就是tar,使用tar命令打包后,就可以用其它的命令来进行压缩了.tar命令的使用方法tar命令 [[email protected] ~]# tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件!特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩.-z :是否

打包/解包/压缩

命令: tar 作用: 可以把文件一系列打包到一个大文件中,也可以把打包过的大文件恢复成一系列文件 选项: -z:调用gzip,压缩和解压缩文件 -j:调用bzip2,压缩和解压文件 -c:生成档案文件,创建打包文件 -x:解开档案文件 -v:列出归档解档的详细过程,显示进度 -f:指定档案文件名称,f后面一定是.tar文件,所以必须放选项最后 -C:解压缩到指定目录(要解压缩的目录必须存在) 注意: f选项必须放最后,其他选项顺序随意 使用: # 打包文件(被打包文件可以空格间隔输入多个) t