我已经有了有关.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 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;
}
并且此来源可以解压缩接下来的内容。
mon.dat is working upper source. 那么,
现在我想从“ .dat文件”中提取某些内容 看起来像这样:
cthugha.dat - it was not working from upper extract sources :(
请让我知道要提取下面列出的cthugha.dat文件的组件需要做什么。
答案 0 :(得分:1)
由于您已标记为C ++,因此可以使用类对 record 进行建模,然后编写一些方法来从二进制流中读取类(对象):
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;
}
}