C 如何从.dat文件中提取资源文件?
我已经有了关于.dat文件的提取器源代码。 但是这个来源在其他游戏中使用 然而,这两款游戏是在同一家公司制作的,并且保持着相似的格式 所以我想得到帮助C 如何从.dat文件中提取资源文件?,c,extract,C,Extract,我已经有了关于.dat文件的提取器源代码。 但是这个来源在其他游戏中使用 然而,这两款游戏是在同一家公司制作的,并且保持着相似的格式 所以我想得到帮助 // Sample Code..... #define WIN32_LEARN_AND_MEAN #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h&
// Sample Code.....
#define WIN32_LEARN_AND_MEAN
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <memory.h>
#include <direct.h>
struct dat
{ // total 25byte
unsigned long offset; // 4byte
char name[13]; // 13byte
unsigned long size; // 4byte;
char *data; // 4byte;
};
int main(int argc, char **argv)
{
int value;
char input[512];
printf(" * Select mode\n 1: Pack\n 2: Unpack\n Choose: ");
scanf("%d", &value);
if(value == 1)
{
printf("\n\n *Mode: Pack\n Datname: ");
scanf("%s", input);
dat_pack(input);
}
else if(value == 2)
{
printf("\n\n *Mode: Unpack\n Datname: ");
scanf("%s", input);
dat_unpack(input);
}
printf("\nPress any key to continue\n");
fflush(stdin);
getch();
return 0;
}
int dat_unpack(char *file_name)
{
FILE *fp;
fp = fopen(file_name, "rb");
if (fp == 0)
{
printf(" File does not exist: %s\n", file_name);
return 0;
}
else
{
long i;
long len;
long total;
struct dat *dat;
fread(&total, 4, 1, fp);
len = sizeof(struct dat);
dat = malloc(len*total);
memset(dat, 0, len*total);
*strstr(file_name, ".") = 0; // cute trick :p
printf("\n reading Infomation... ");
for (i = 0; i<total; i++)
{
fread(&(dat[i]), 17, 1, fp);
if (i > 0) dat[i - 1].size = dat[i].offset - dat[i - 1].offset;
}
printf("ok.\n Total %d data(s) in dat file.\n", --total);
for (i = 0; i<total; i++)
{
file_write(&(dat[i]), fp, file_name);
}
printf(" Unpack Complete!\n");
free(dat);
fclose(fp);
}
return 1;
}
这个来源可以解压接下来的事情
那么,
现在我想从“.dat文件”中提取一些内容
看起来是这样的:
:
请让我知道我需要做什么来提取下面列出的cthuHa.dAT文件的组成部分。 因为你被标记为C++,你可以用一个类来建模一个记录,然后编写一些方法从二进制流读取类对象:
class Record
{
public:
unsigned long size;
unsigned long offset;
std::string name;
std::vector<uint8_t> data;
void load_from_file(std::istream& input);
};
void Record::load_from_file(std::istream& input)
{
// Use uint8_t as a byte.
offset = 0UL;
for (size_t i = 0; i < 4; ++i)
{
uint8_t byte;
input.read((unsigned char *) &byte, 1);
// Assume Big Endian
offset = offset * 256 + byte;
}
// read in other fields from file.
//...
}
这与C++、un包装和DAT协议都不相关。如果没有所讨论的文件格式的规范,这将是一个尝试、错误和运气的问题。如果代码是专门为mom.dat格式编写的,那么cthuga.dat与mom.dat类似并没有什么帮助。HexDump的屏幕截图也没有帮助。注意:允许编译器在成员之间插入填充字节。如果不需要填充字节,搜索你的编译器的任何文件的包装结构的包装。我在寒冷的年龄,不再关心这么多,如果人们正在编译C代码与C++编译器,除非它真的很重要,这似乎不是这里的情况,但请阅读标签信息,以确保标签在使用之前标签适合。如果标签没有信息,它可能是不好定义的,除非你真的确信它不是什么意思,否则不应该使用。IHOO,最好用一个数据成员声明一个C++类,比如使用STD::String,并使用序列化技术从模型中读取数据成员;不要试图按照文件格式对结构建模。您确实应该定义一个“.dat文件”。文件名/扩展名没有任何意义。
std::vector<Record> database;
Record r;
while (true)
{
r.load_from_file(data_file);
if (data_file)
{
database.push_back(r);
}
else
{
break;
}
}