如何在C++文件中存储文本以外的非文本数据 如图像、视频等资源
C++ 存储非文本资源的可行性及实现方案
完全可以将图像、视频等非文本资源存储到C++相关文件中,常见的实现方式分为两类:
- 方案1:二进制资源转字符数组嵌入源码
这是跨平台兼容性最好的方案,不需要额外依赖平台特性。你可以通过工具先把资源的二进制内容转换为C/C++兼容的十六进制字符数组,直接写入.h或.cpp文件中,编译后资源就会被直接打包进最终的可执行文件。
示例代码结构如下:
// 资源头文件 resource.h #ifndef RESOURCE_H #define RESOURCE_H // 声明资源数组和长度 extern const unsigned char demo_png[]; extern const unsigned int demo_png_len; #endif
// 资源实现文件 resource.cpp #include "resource.h" // 存储图片二进制的十六进制数组,由转换工具自动生成 const unsigned char demo_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, // 后续为完整二进制对应的十六进制值 }; const unsigned int demo_png_len = sizeof(demo_png);
不需要手动转换二进制内容,Linux 下可直接用xxd -i 输入资源路径 输出文件路径命令一键生成对应数组文件,Windows 也有大量轻量转换工具可以完成该操作。
- 方案2:使用平台专属资源编译机制
Windows 平台可以编写RC资源脚本,把资源直接打包进PE格式的可执行文件,后续通过FindResource、LoadResource等系统API直接读取;Linux、macOS 平台也可以通过ld链接器直接把二进制资源链接到可执行文件中,不需要转成源码数组。
注意事项
- 体积较小的资源(如几MB以内的图标、界面素材、短音效)适合用嵌入方式,不用处理资源路径匹配、文件丢失等问题,发布更方便
- 大体积的高清视频、大尺寸图片不建议嵌入源码,会导致可执行文件体积过大、编译速度明显变慢,这类场景更建议资源和可执行文件分开存放,运行时动态读取
- 嵌入的资源为只读属性,如果需要对存储的内容做修改,不能直接修改嵌入的数组,需要单独使用本地文件或其他可写存储介质存放可变更数据
内容的提问来源于stack exchange,提问作者Abhijay7
相关产品推荐
相关产品推荐

