Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从.dat文件中提取资源文件?_C_Extract - Fatal编程技术网

C 如何从.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&

我已经有了关于.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;
}
这个来源可以解压接下来的事情

那么,

现在我想从“.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;
  }
}