我有我想直接嵌入到我的源代码的二进制文件,所以它会被直接编译成.exe文件,而不是从文件中读取它,所以数据应该已经在内存时我启动程序。
我该怎么做呢?
唯一的想法,我得到了我的二进制数据编码为BASE64,把它放在一个字符串变量,然后将其解码回原始的二进制数据,但是这是棘手的方法,这将导致无谓的内存分配。另外,我想将数据存储在该.exe紧凑的原始数据。
编辑:我想使用Base64的原因是因为我想使源代码文件尽可能小了。
最简单,最简便的方式是写一个小程序,将数据转换成C ++源代码,然后编译并将其链接到你的程序。这个生成的文件可能看起来是这样的:
unsigned char rawData[] =
{
0x12, 0x34, // ...
};
有工具,这一点,典型的名称是“bin2c”。第一个搜索结果是this page。
你需要做一个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 ++,在那里你可以有一个char
类型的文字,你可以考虑使用的格式,例如这个,而是:
static const char my_data[] = { '\xfe', '\xab', /* ... */ };
因为这只是一个字符数组,你也可以同样使用普通字符串文字语法。嵌入零字节应该罚款,只要你不要试图把它作为一个字符串:
static const char my_data[] = "\xfe\xdab ...";
这是最紧凑的解决方案。事实上,你很可能使用了C,太。
您可以使用资源文件(.RC)。有时候,他们是坏的,但对于基于Windows的应用程序,是通常的方式。
为什么BASE64?只需将文件存储,因为它是在一个char*
。