2010-10-25 2 views
2

Пару дней назад я спросил, как можно изменить формат файла. Хотя это не получилось, кто-то дал мне формат файла. (Click Here) Спасибо, Xadet.C++ Использование формата файла

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

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

Любая помощь была бы значительно оценена.

+1

Извините, но в чем вопрос? И почему inline-asm/C++? – ereOn

+0

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

+0

Предлагаю вам изменить свой вопрос и добавить эту информацию для будущих читателей. Не все читают комментарии. Во всяком случае, я никогда не видел такого формата: он выглядит как объявление условной структуры. С чего взял ? Возможно, это поможет понять, какова цель. – ereOn

ответ

1

Я предполагаю, что вы не хотите иметь программу на С ++, которая читает этот документ формата файла при его запуске, а затем анализирует фактический файл данных на этой основе. Вместо этого вам просто нужна программа на 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 

НТН, Тони

+0

const dds & d = * (const dds *) p; это не очень хорошая идея из-за проблем с упаковкой/выравниванием. – frast

+0

Хорошо, спасибо. Я до сих пор не знаю, как его использовать, но это, вероятно, только потому, что я должен больше исследовать формат файла. По крайней мере теперь я знаю, как преобразовать псевдокод. – Nick

+0

@frast: да ... было немного лениво об этом. Googling ZSTR, он выглядит как строка ASCIIZ без заполнения, поэтому следующие данные могут быть смещены. Если ваша архитектура чувствительна к этому, тогда лучше всего прочитать каждое последующее поле (или группу sans ZSTR) в один максимально выровненный буфер. –

2

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

+0

Ааа, это будет облом. Но скажем, у меня есть формат файла, есть ли у вас пример о том, как его использовать? Это все немного запутанно, я могу найти форматы файлов и как создавать форматы файлов, но я не могу найти что-либо об использовании/компиляции. – Nick

+1

@Nick: Каков ваш опыт работы с C++? Вы не компилируете форматы, это всего лишь предопределенный способ хранения информации, и вы можете прочитать ее, потому что она в ожидаемом формате. Просто проанализируйте файл и получите необходимую информацию. – GManNickG

+0

Не так уж здорово, если честно, я больше человек C#. Это не значит, что я ничего не знаю об этом. : P – Nick

0

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

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

Смежные вопросы