有一种经典的方法可以将资源文件作为C语言数组嵌入二进制文件中,这样我们就可以将一些外部资源文件(如 .jpeg
或 .txt
文件)存储到一个二进制文件中。
例如,在头文件中我们可以定义一个数组:
const unsigned char xd_data[] = {
77,90,144,0,3,0,0,0,4,0,0,0,255,255,0,0,184,0,0,0,0,0,0,0,64,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,
0,14,31,186,14,0,180,9,205,33,184,1,76,205,33,84,104,105,115,32,112,114,
111,103,114,97,109,32,99,97,110,110,111,116,32,98,101,32,114,117,110,
32,105,110,32,68,79,83,32,109,111,100,101,46,13,13,10,36,0,0,0,0,0,0,
0,66,163,223,218,6,194,177,137,6,194,177,137,6,194,177,137,105,221,187,
137,13,194,177,137,133,222,191,137,3,194,177,137,105,221,181,137,4,194,
177,137,136,202,238,137,4,194,177,137,6,194,176,137,73,194,177,137,133,
202,236,137,13,194,177,137,48,228,187,137,11,194,177,137,193,196,183,
137,7,194,177,137,82,105,99,104,6,194,177,137,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,80,69,0,0,76,1,4,0,65,162,32,86,0,0,0,0,0,0,0,
0,224,0,47,1,11,1,6,0,0,100,0,0,0,74,0,0,0,0,0,0,228,113,0,0,0,16,0,0,
0,128,0,0,0,0,64,0,0,16,0,0,0,2,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,
224,0,0,0,4,0,0,0,0,0,0,2,0,0,0,0,0,16,0,0,16,0,0,0,0,16,0,0,16,0,0,0,
0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,124,140,0,0,140,0,0,0,0,208,0,0,0,16,0
};
这段代码包含了资源文件的内容,会被编译进最终的二进制文件中。
网络上有很多关于这个老技巧的工具和教程,例如:http://www.rowleydownload.co.uk/arm/documentation/index.htm?http://www.rowleydownload.co.uk/arm/documentation/embed.htm、https://www.fourmilab.ch/xd/ 和 http://gareus.org/wiki/embedding_resources_in_executables#c_include_method。
然而,大多数页面似乎都在谈论如何使用C语言风格的数组来嵌入数据到二进制文件中。
我的问题是,如何正确找到已编译二进制文件中资源文件的起始地址以便提取它们?也就是说,我怎样才能找到编译后二进制文件中 xd_data
的起始地址?
include
方法,在你的示例中只需访问该变量xd_data
。而对于二进制链接选项,第二个参考文献中有一个段落开头为:“这个数据段可以通过简单地使用以下方法在 C 代码中引用:...”。那对于某些原因,这种方式是否无法正常工作或不适合您呢? - kaylum