将原始数据写入文件并使用 bin2c

Writing raw data to a file and using bin2c

本文关键字:bin2c 文件 原始数据      更新时间:2023-10-16

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

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,
};

使用标准的 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 数组并取消强制转换。

还有

我在 C++ 14 中制作的 bin2c 转换工具。最重要的是,它是开源的,不仅可以在Windows上运行,还可以在OSX(MAC(和Linux上运行。

你可以在 https://www.github.com/AraHaan/bin2c

我的工具最好的部分是它很快取决于文件大小,但至少它可以工作。当我发现这里和那里是否有错误时,我确实经常更新它,但至少它可以完成工作。我还在其中添加了一些编译时技巧,如果月份的日期小于 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;
}