2013-05-09 129 views
0

我的程序很長很複雜,所以我無法解釋這一切,但是我會試着解釋一下我目前的情況。(C++)將十六進制文件寫入.dat文件時出現問題

我有一個.dat文件(其中729個,但在本例中只有1個),我需要用包含十六進制值的幾個字符串覆蓋整個文件(即使我的新數據小於當前數據)。

這裏是我的程序片段:

ofstream xbox_final(xboxit->c_str(), ios::binary); 

//other stuff 

xbox_final.write("0a00000a00054c6576656c070006426c6f636b7300008000", 48); 
xbox_final.write(new_bytes, new_bytes.length()); 
xbox_final.write(xboxbytes, xboxbytes.length()); 
xbox_final.close(); 

「xboxit-> c_str()」中的ofstream的是那裏,因爲我輸入和從文件列表輸出文件的一羣,這是必要的,但如果這是有道理的,我不會犯錯。

字符串「new_bytes」和「xboxbytes」中包含的十六進制值(000007000a0445等)

現在我的計劃剛剛被寫入到一個文本文件。我需要它將該十六進制數據按照該順序寫入.dat文件。

我做了一些摸索和這個修復爲const char問題:

//other stuff 

string header("0a00000a00054c6576656c070006426c6f636b7300008000"); 

WriteStr2BinFh(header, xbox_final); 
WriteStr2BinFh(new_bytes, xbox_final); 
WriteStr2BinFh(xboxbytes, xbox_final); 

//other stuff 

void WriteStr2BinFh(const std::string& St, std::ostream &out) 
{ 
    out.write(St.c_str(), St.size()); 
} 

創建新的.dat文件在其他地方也是一個可接受的選擇。

我不能寫HEX值,他們總是在DAT文件中顯示爲文本。

任何幫助,將不勝感激:)

回答

0

的一種方式,以「輕鬆」這樣做,同時保持當前的「模式」將是把"\x"在你的字符串的每一個十六進制值的前面。編譯器會將它們視爲實際值,而不是一對字符。

我的意思是:

std::cout << "4A4A" << std::endl;

將輸出:

4A4A

std::cout << "\x4A\x4A" << std::endl;

將輸出:

JJ

因爲0x4A爲ASCII字符J十六進制值。當然,如果你將這個字符串寫入一個文件,含義也是一樣的。

如果您想繼續使用字符串來存儲它,您需要更改構造函數,因爲您的字符串將包含值0

string header("your_hex_chain", number_of_bytes_in_your_chain); // \x00 is one byte, for example

它將,然而,更容易使用struct來存儲你的頭的值,如果直接將.dat文件編寫。但我不知道你想做什麼,所以...

+0

感謝您的快速回復!通過執行\ x事情,這將如何影響十六進制值而不分配給他們的字符?例如:00-> 09是「null」,如果你願意並且將顯示爲空格。十六進制數據是否會正確寫入文件?另外,我之前從未使用過const,因爲我只是一個初學者。我從網上獲得了const的代碼。我將需要在SOMETHING中存儲所有內容,因爲它存儲的是十六進制數。我每次都不能/ x。 – mrg95 2013-05-09 02:41:05

+0

你剛纔編輯過的帖子--->是的,我不知道結構是什麼。我可以查看它,但我認爲有一種快速簡單的方法可以將數據寫回來,就像我讀過的一樣。 – mrg95 2013-05-09 02:43:13

+0

00-> 09是不可打印的字符 - 您無法人工讀取它們,但它們會作爲文件中的值顯示。你可以用一個非常小的代碼嘗試一下:試着寫一個「\ x00 \ x01 \ xothervalues」到一個文件中,然後用十六進制編輯器打開它以獲得一個好主意。至於你的第二個問題,這一切都取決於你如何得到你的價值觀! – Nbr44 2013-05-09 02:45:07

相關問題