C ++ Использование формата файла - PullRequest
2 голосов
/ 25 октября 2010

Пару дней назад я спросил, как вы можете провести обратный инжиниринг формата файла. Хотя это не сработало, кто-то дал мне формат файла. ( Нажмите здесь ) Спасибо, Xadet.

Я все еще новичок во всем этом, и мне было интересно, куда мне идти отсюда. Я предполагаю, что мне придется использовать inline-asm в C ++, чтобы использовать этот формат, но я не знаю, как на самом деле открыть файл с помощью этого или вставить в него данные.

Итак, вопрос в том, как использовать формат файла для получения или вставки данных? И формат файла выглядит как asm, но я не хочу начинать программировать на чистом ASM. Я уже видел людей, программирующих asm на C ++, поэтому я думаю, что это был бы хороший выбор

Любая помощь будет высоко оценена.

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Описание формата файла не похоже на asm, оно выглядит как псевдокод.

1 голос
/ 25 октября 2010

Я предполагаю, что вы не хотите иметь программу на C ++, которая читает этот документ формата файла при запуске, а затем анализирует фактический файл данных на этой основе.Вместо этого вам нужна программа на C ++, предназначенная для чтения текущей версии этого формата файлов?(Это намного проще и будет работать быстрее).Вам не нужно использовать ASM.Что вам нужно сделать, это определить типы C ++, которые эквивалентны именам, используемым в файле формата.Например, я думаю, что DWORD используется в языках Microsoft для обозначения целого числа определенного размера - может быть, 32 или 64 бита.Отследите этот материал, а затем создайте структуры C ++ с эквивалентными элементами.

Например:

#include <inttypes.h> // if on Windows, try __int32, __int64 etc. instead

typedef int64_t DWORD;  // or whatever width you find it's meant to be
typedef int32_t WORD;
typedef ??? ZSTR;  // google it...?
typedef float FLOAT;

struct dds
{
    ZSTR path;
    WORD is_skin;
    WORD alpha_enabled;
    WORD two_sided;
    WORD alpha_test_enabled;
    WORD alpha_ref;
    WORD z_write_enabled;
    WORD z_test_enabled;
    WORD blending_mode; // None = 0, Custom = 1, Normal = 2, Lighten = 3
    WORD specular_enabled;
    FLOAT alpha;
    WORD glow_type; // None = 0, NotSet = 1, Simple = 2, Light = 3, Texture = 4, TextureLight = 5, Alpha = 6
    FLOAT red;
    FLOAT green;
    FLOAT blue;
};

// point p at the entire input, which you'll have loaded into memory somewhere
// (e.g. f/stat() the file size then allocate heap and read into it, or memory map)
const char* p = input;
DWORD mesh_count = *(const DWORD*)p;
p += sizeof(DWORD);
for (int i = 0; i < mesh_count; ++i)
{
    const dds& d = *(const dds*)p;
    // you can use d.red, d.alpha etc. here to do anything you like
    p += sizeof dds;
}

// continue processing effect count etc... in same style

HTH, Tony

0 голосов
/ 25 октября 2010

Это своего рода язык сценариев для определения формата данных, похожий на XDR . Вам просто нужно написать для него парсер (не пытайтесь использовать скрипт во время выполнения). Напишите некоторые функции, такие как get_WORD_BE() или get_DWORD_LE() и т. Д., Чтобы вы не зависели от endiannes.

Да, и если вы хотите использовать подход Тони, добавьте #pragma pack(1).

...