C语言 如何从文件中提取资源文件.dat?



我已经有了关于.dat文件的提取器源。 但此来源用于其他游戏。

但是,这两款游戏是在同一家公司制作的,并保持相似的格式。

所以我想得到帮助。

// 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 moden  1: Packn  2: Unpackn Choose: ");
scanf("%d", &value);
if(value == 1)
{
printf("nn *Mode: Packn  Datname: ");
scanf("%s", input);
dat_pack(input);
}
else if(value == 2)
{
printf("nn *Mode: Unpackn  Datname: ");
scanf("%s", input);
dat_unpack(input);
}
printf("nPress any key to continuen");
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: %sn", 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正在上层源头工作。 那么,

现在我想从".dat文件"中提取一些东西 看起来像这样:

Cthugha.dat - 它无法从上层提取源工作 :(

请让我知道我需要做什么才能提取下面列出的 cthugha.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.
//...
}

将类建模为数据文件记录允许程序利用更安全的数据结构。

输入法允许从数据文件格式转换为平台格式。 例如,输入文件将允许您将多字节整数读取为平台的格式,而不管平台的字节序如何。

std::vector允许在运行时不知道数据量的情况下包含数据。

用法示例:

std::vector<Record> database;
Record r;
while (true)
{
r.load_from_file(data_file);
if (data_file)
{
database.push_back(r);
}
else
{
break;
}
}

最新更新