2013-05-09 72 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

相关问题