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

时间:2012-05-06 17:51:39

标签: c++ binary

好的,所以我对C ++很新,我遇到了一个程序,它可以获取exe或bin文件并将其放入.h文件中以便与C ++一起使用。我遇到的问题是如何将bin2c genarats的原始数据写入文件然后重现相同的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,
};

2 个答案:

答案 0 :(得分: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数组并取消强制转换。

答案 1 :(得分:0)

还有我在C ++ 14中制作的bin2c转换工具。最重要的是它的开源,不仅适用于Windows,也适用于OSX(MAC)和Linux。

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

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

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

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

public class NumberPickerPreference extends DialogPreference
{
    public NumberPickerPreference(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setDialogLayoutResource(R.layout.numberpicker);
    }
}