0

我的程序很长而且很复杂,所以我无法解释全部,但是我会尽量解释我目前的情况。

我有一个 .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 文件中显示为文本。

任何帮助,将不胜感激 :)

4

1 回答 1

0

在保持当前“模型”的同时“轻松”执行此操作的一种方法是将"\x"字符串中的每个十六进制值放在前面。然后编译器会将它们视为实际值,而不是一对字符。

我的意思是 :

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

将输出:

4A4A

然而

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

会输出:

JJ

因为0x4A是 ascii 字符的十六进制值J。当然,如果您将此字符串写入文件,其含义将是相同的。

如果您想继续使用字符串来存储它,则需要更改构造函数,因为您的字符串将包含 value 0

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

但是,使用 astruct来存储标头的值并直接写入 .dat 文件会容易得多。但我不知道更多关于你想要做什么,所以......

于 2013-05-09T02:35:42.140 回答