(C ++)无法将hex写入.dat文件

时间:2013-05-09 02:26:35

标签: c++ binary hex overwrite ofstream

我的程序非常复杂,所以我无法解释所有这些,但我会尝试解释当前的情况。

我有一个.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();
在ofstream中的“xboxit-> c_str()”是因为我正在从文件列表中输入和输出BUNCH文件,这是必要的,但如果有意义的话,我没有错误。

字符串“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文件也是一种可接受的选择。

我不能写出十六进制值,它们总是在DAT文件中显示为文本。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

一种方便的方式"在保持现有"模型的同时做到这一点#34;将"\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文件。但是我不太了解你正在尝试做什么,所以......