作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经有了有关 .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 文件的组件。
最佳答案
由于您标记为 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;
}
}
关于c - 如何从.dat文件中提取资源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52237163/
我是一名优秀的程序员,十分优秀!