【问题标题】:(C++) Trouble writing hex to .dat file(C++) 无法将十六进制写入 .dat 文件
【发布时间】:2013-05-03 10:22:54
【问题描述】:

我的程序很长而复杂,所以我无法解释一切,我会试着解释我目前的情况。

我有一个 .dat 文件(其中 729 个,但本例中只有 1 个),我需要用几个包含十六进制值的字符串覆盖整个文件(即使我的新数据小于当前数据)。

这是我程序中的一个 sn-p:

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()”在那里,因为我正在从文件列表中输入和输出一组文件,这是必要的,但如果有意义的话,我不会出错。

字符串“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 文件中显示为文本。

任何帮助将不胜感激:)

【问题讨论】:

    标签: c++ binary hex overwrite ofstream


    【解决方案1】:

    在保持当前“模型”的同时“轻松”执行此操作的方法是将"\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 文件会容易得多。但我不知道更多关于你想要做什么,所以......

    【讨论】:

    • 感谢您的快速回复!通过做 \x 事情,这将如何影响没有分配字符的十六进制值?例如: 00-> 09 如果您愿意并且将显示为空格,则为“null”。十六进制数据会正确写入文件吗?另外,我以前从未使用过 const 因为我只是一个初学者。我从网上得到了带有 const 的代码。我需要将所有内容存储在 SOMETHING 中,因为它存储了大量的十六进制。我每次都无法/x。
    • 您刚刚编辑了帖子 ---> 是的,我也不知道结构是什么。我可以查一下,但我想有一种快速简便的方法可以像读取数据一样将数据写回。
    • 00->09 是不可打印的字符 - 您无法人工读取它们,但它们会在文件中显示为值。你可以用一个非常小的代码来尝试它:尝试将“\x00\x01\xothervalues”写入一个文件,然后用十六进制编辑器打开它以获得一个好主意。至于你的第二个问题,这一切都取决于你首先如何获得你的价值观!
    • 是的,\x 的东西很好用!我能够很好地编写标题。我根据从文本文件中读取的数据将自己的十六进制值放入每个字符串中。我会从 txt 中读取 0007070701010101 ..... 等,然后将其转换为我需要的内容并将其放入字符串中。另外,我该如何解决我需要它来覆盖整个文件的问题?我需要删除 dat 文件中当前的所有内容并写入我的新数据。
    • 如果您将十六进制值读取为 text,则需要将每对字符转换为整数值。如果您将十六进制值读取为 values,则无需进行此类处理,只需立即将其写入文件即可。覆盖你自己的文件很容易:看看ofstream的构造函数,一个选项可以让你完全清空你正在打开的文件。
    猜你喜欢
    • 2014-03-16
    • 2013-05-03
    • 2013-04-30
    • 2015-08-22
    • 2015-01-03
    • 1970-01-01
    • 2013-07-11
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多