0

好的,所以我对 C++ 相当陌生,我遇到了一个程序,它可以获取 exe 或 bin 文件并将其放入 .h 文件中以与 C++ 一起使用。我遇到的问题是如何将 bin2c 生成的原始数据写入文件,然后重现相同的 exe。您可以在下面找到原始数据的代码。(使用 cygwin 编译。)我不在 PC 上,所以我无法使用代码标签来显示代码抱歉。

const unsigned char raw_data[] = {
    0x21, 0x20, 0xc2, 0xa6, 0xc3, 0xb4, 0xc2, 0xbf,
    0xc3, 0x82, 0xc3, 0x8b, 0xc2, 0xa4, 0x20, 0xc3,
    0x8d, 0xc3, 0x8c, 0x4c, 0x3f, 0x20, 0x20, 0xc3,
    0x80, 0xc3, 0xbf, 0x20, 0x20, 0xc3, 0x80, 0xc3,
    0xbf, 0xc2, 0xa5, 0x20, 0xc5, 0xa1, 0xe2, 0x84,
    0xa2, 0xc2, 0xa9, 0x40, 0x20, 0x20, 0xc3, 0x80,
    0xc3, 0xbf, 0x20, 0x20, 0xc3, 0x80, 0xc3, 0xbf,
    0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x21, 0x20,
    0x48, 0xc2, 0xb7, 0xc3, 0xb4, 0xc2, 0xbf, 0xc3,
    0x82, 0xc3, 0x8b, 0xc2, 0xa4, 0x20, 0xc3, 0x8d,
    0xc3, 0x8c, 0x4c, 0x3f, 0x20, 0x20, 0xc3, 0x80,
    0xc3, 0xbf, 0x33, 0x33, 0x33, 0x3f, 0xc2, 0xa5,
    0x20, 0xc5, 0xa1, 0xe2, 0x84, 0xa2, 0xc2, 0xa9,
    0x40, 0x20, 0x20, 0xc3, 0x80, 0xc3, 0xbf, 0x66,
    0x66, 0xc2, 0xa6, 0x40, 0x0a,
};
4

2 回答 2

4

使用标准 C++ I/O 体操:

#include <fstream>

std::ofstream outfile("output.bin", std::ios::binary);

if (!outfile) { /* error, die! */ }

outfile.write(reinterpret_cast<char const *>(raw_data), sizeof raw_data);

如果您愿意,您可以将数组声明为const char数组并取消强制转换。

于 2012-05-06T17:57:43.037 回答
0

还有我用 C++ 14 制作的 bin2c 转换工具。最棒的是它是开源的,不仅适用于 Windows,而且适用于 OSX (MAC) 和 linux。

你可以在https://www.github.com/AraHaan/bin2c找到它<-- 这个链接肯定不会移动,除非 github 改变了位置,很明显他们不应该。

我的工具最好的部分是它的速度取决于文件大小,但至少它可以工作。当我发现这里和那里是否存在错误时,我会经常更新它,但至少它可以完成工作。我还添加了一点编译时间技巧,如果当月的日期小于 10,它会去除其中的一个空格,以使处理后的文件看起来不错。当前版本是 v0.15.0 到。此外,如果您想知道为什么 1 构建失败,那是因为 travis 没有 clang 3.9 和 g++ 5.3+。但是,我建议在 g++ 6 或 clang 3.9 上构建它(由于实验性 C++ 14 文件系统头文件,它处理的最低版本)。

希望这有助于解决其他想要 bin2c 工具的人。我的也可以将文件制作成 C# 数组,以供那些想要这样做的人使用。

我的 bin2c 工具也有一个测试,它也提供了一个示例,该示例如下:

#include <string>
#include <iostream>
#include <fstream>
#include "VP.hpp"

int main()
{
    std::string created_msg = "Created ";
    created_msg += IMAGE_VP_NAME;
    created_msg += ".";
    std::string FILE_NAME = ".\\";
    FILE_NAME += IMAGE_VP_NAME;
    std::ofstream f(FILE_NAME, std::ios::out | std::ios::binary | std::ios::ate);
    f.write(reinterpret_cast<char const *>(IMAGE_VP), IMAGE_VP_SIZE);
    std::cout << created_msg << std::endl;
    std::cin.ignore();
    return 0;
}
于 2017-01-04T02:38:00.187 回答