C++:如何使用Visual Studio将原始二进制数据添加到源代码中?

Roo*_*kie 13 c++ binary-data visual-studio-2008

我有一个二进制文件,我想直接嵌入到我的源代码中,因此它将直接编译到.exe文件中,而不是从文件中读取它,所以当我启动程序时数据已经在内存中.

我该怎么做呢?

我得到的唯一想法是将我的二进制数据编码为base64,将其放入字符串变量然后将其解码回原始二进制数据,但这是一种棘手的方法,会导致无意义的内存分配.此外,我想将.exe中的数据存储为原始数据的紧凑.

编辑:我之所以使用base64的原因是因为我想让源代码文件尽可能小.

Jam*_*nze 10

最简单,最便携的方法是编写一个小程序,将数据转换为C++源代码,然后编译并将其链接到程序中.生成的文件可能类似于:

unsigned char rawData[] =
{
    0x12, 0x34, // ...
};
Run Code Online (Sandbox Code Playgroud)


unw*_*ind 5

有一些工具,典型的名称是"bin2c".第一个搜索结果是此页面.

你需要制作一个char数组,最好也做一个static const.

在C:

可能需要一些注意,因为您不能拥有char-typed文字,并且还因为C的char数据类型的签名通常取决于实现.

您可能想要使用诸如的格式

static const unsigned char my_data[] = { (unsigned char) 0xfeu, (unsigned char) 0xabu, /* ... */ };
Run Code Online (Sandbox Code Playgroud)

请注意,每个unsigned int文字都被强制转换为unsigned char,并且'u'后缀使它们无符号.

由于这个问题适用于C++,你可以在其中使用char-typed文字,你可以考虑使用这样的格式,而不是:

static const char my_data[] = { '\xfe', '\xab', /* ... */ };
Run Code Online (Sandbox Code Playgroud)

因为这只是一个char数组,所以你也可以使用普通的字符串文字语法.嵌入零字节应该没问题,只要您不尝试将其视为字符串:

static const char my_data[] = "\xfe\xdab ...";
Run Code Online (Sandbox Code Playgroud)

这是最紧凑的解决方案.事实上,您也可以将它用于C语言.