我有一个二进制文件,我想直接嵌入到我的源代码中,所以它将被直接编译成.exe文件,而不是从文件中读取,所以当我启动程序时数据已经在内存中了。
我该怎么做?
我得到的唯一想法是将我的二进制数据编码为base64,把它放在字符串变量中,然后解码回原始二进制数据,但这是一个棘手的方法,会导致无意义的内存分配。此外,我希望将数据存储在.exe中,就像原始数据一样紧凑。
编辑:我想到使用base64的原因是因为我想使源代码文件尽可能小。
最简单和最可移植的方法是编写一个小的程序,将数据转换为c++源代码,然后编译然后把它链接到你的程序中。生成的文件可能看起来像:
unsigned char rawData[] =
{
0x12, 0x34, // ...
};
有这样的工具,一个典型的名称是"bin2c"。第一个搜索结果是这个页面。
你需要做一个char
数组,最好也做一个static const
。
可能需要一些注意,因为你不能有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*
中。