2010-10-25 53 views
2

幾天前,我問你如何能夠反向工程文件格式。雖然這並沒有真正解決,但有人給我的文件格式。 (Click Here)謝謝Xadet。C++使用文件格式

我對這一切還很陌生,我想知道我應該從哪裏出發。我猜測我將不得不在C++中使用inline-asm來使用這種格式,但我不知道如何使用它實際打開文件或將數據插入到其中。

所以問題是,我該如何使用文件格式來獲取或插入數據?文件格式看起來像asm,但我不想在純ASM中開始編程。我看過人們在C++編程asm之前,這就是爲什麼我認爲這將是一個不錯的選擇

任何幫助將大大apreciated。

+1

對不起,但是什麼問題?爲什麼inline-asm/C++? – ereOn 2010-10-25 06:48:31

+0

問題是,我如何使用文件格式來獲取或插入數據?文件格式看起來像asm,但我不想在pur ASM中開始編程。我以前見過用C++編程asm的人,這就是爲什麼我認爲這將是一個不錯的選擇。 – Nick 2010-10-25 06:52:00

+0

我建議你編輯你的問題,併爲未來的讀者添加這條信息。並非所有人都閱讀評論。無論如何,我從來沒有見過這樣的格式:它看起來像一個條件結構聲明。你從哪裏得到那個的 ?也許它可以幫助理解確切的目標。 – ereOn 2010-10-25 06:55:45

回答

1

我假設您不想讓C++程序在啓動時讀取該文件格式文檔,然後在此基礎上解析實際的數據文件。相反,你只想要一個專用於讀取該文件格式的當前版本的C++程序? (這更簡單,運行速度更快)。你不需要使用ASM。你需要做的是制定出與格式文件中使用的名稱相同的C++類型。例如,我認爲在Microsoft語言中使用DWORD是指一個特定大小的整數 - 可能是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, 託尼

+0

const dds&d = *(const dds *)p;由於包裝/對齊問題,這不是一個好主意。 – frast 2010-10-25 07:28:05

+0

好的,謝謝。我仍然不知道如何使用它,但這可能只是因爲我應該對文件格式是什麼進行更多的研究。至少現在我知道如何轉換'僞代碼'。 – Nick 2010-10-25 07:48:13

+0

@frast:是的......對此有點懶惰。谷歌搜索ZSTR,它看起來像一個沒有填充的ASCIIZ字符串,所以下面的數據可能會錯位。如果您的體系結構對此敏感,那麼最好將每個連續的字段(或無組的ZSTR)讀入相同的最大對齊緩衝區。 – 2010-10-25 07:50:59

2

文件格式說明看起來不像asm,它看起來像僞代碼。

+0

啊,那會很無趣..但讓我說我有文件格式,你有一個關於如何使用它的例子嗎?這有點令人困惑,我可以找到文件格式,以及如何製作文件格式,但我無法找到任何有關實際使用/編譯文件的信息。 – Nick 2010-10-25 07:05:31

+1

@Nick:你對C++有什麼經驗?您不需要「編譯」格式,它們只是存儲信息的預定義方式,您可以閱讀它,因爲它的格式是預期的。只需解析文件並獲取所需的信息即可。 – GManNickG 2010-10-25 07:06:13

+0

老實說,我更像一個C#人。這並不意味着我對此一無所知。 :P – Nick 2010-10-25 07:07:39

0

這是用於定義數據格式,類似於XDR的東西的一種腳本語言。 你只需要爲它編寫一個解析器(不要試圖在運行時使用腳本)。寫一些函數,如get_WORD_BE()get_DWORD_LE()等,這樣你就不依賴endiannes了。

是的,如果您想使用Tony的方法,請添加一些#pragma pack(1)