如何在Visual Studio中添加原始二进制数据到源代码中

C++: How to add raw binary data into source with Visual Studio?

本文关键字:二进制 数据 源代码 原始 添加 Visual Studio      更新时间:2023-10-16

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

我该怎么做?

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

编辑:我想到使用base64的原因是因为我想使源代码文件尽可能小。

最简单和最可移植的方法是编写一个小的程序,将数据转换为c++源代码,然后编译然后把它链接到你的程序中。生成的文件可能看起来像:

unsigned char rawData[] =
{
    0x12, 0x34, // ...
};

有这样的工具,一个典型的名称是"bin2c"。第一个搜索结果是这个页面。

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

在C:

可能需要一些注意,因为你不能有char类型的文字,也因为通常C的char数据类型的签名取决于实现。

您可能想使用像

这样的格式
static const unsigned char my_data[] = { (unsigned char) 0xfeu, (unsigned char) 0xabu, /* ... */ };

请注意,每个unsigned int字面值都被强制转换为unsigned char,还有'u'后缀使它们无符号。

由于这个问题是针对c++的,在c++中可以具有char类型的文字,因此您可以考虑使用这样的格式:

static const char my_data[] = { 'xfe', 'xab', /* ... */ };

因为这只是一个char数组,所以您也可以使用普通的字符串字面语法。嵌入零字节应该没问题,只要你不试图把它当作字符串:

static const char my_data[] = "xfexdab ...";

这是最紧凑的解决方案。事实上,您也可以在C中使用它

可以使用资源文件(.rc)。有时它们很糟糕,但对于基于Windows的应用程序,这是通常的方法。

为什么是base64?只需将文件存储在一个char*中。