zoukankan      html  css  js  c++  java
  • 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);//需要注意
    31         pic[i].fileName[pic[i].fileNameSize] = '';
    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文件将图片文件解包

  • 相关阅读:
    django 常用命令
    nginx+gunicorn
    终于决定写个技术博客
    test
    自定义控件
    .net mvc 发布部署到机器上
    C# StringExt 字符串扩展
    MYSQL连接数据库
    List IEnumerable
    CentOS安装pip
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11388142.html
Copyright © 2011-2022 走看看