3 回答

TA貢獻(xiàn)1877條經(jīng)驗 獲得超6個贊
使用imagemagick:
convert file.png data.h
給出類似的東西:
/* data.h (PNM). */static unsigned char MagickImage[] = { 0x50, 0x36, 0x0A, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4D, 0x50, 0x0A, 0x32, 0x37, 0x37, 0x20, 0x31, 0x36, 0x32, 0x0A, 0x32, 0x35, 0x35, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, ....
為了與其他代碼兼容,您可以使用它fmemopen
來獲取“常規(guī)” FILE *
對象,或者std::stringstream
使用iostream
。std::stringstream
雖然不是很好,你當(dāng)然可以在任何可以使用迭代器的地方使用指針。
如果你在automake中使用它,請不要忘記適當(dāng)?shù)?a >設(shè)置BUILT_SOURCES。
這樣做的好處是:
你得到文本,所以它可以在版本控制和補丁明智
它在每個平臺上都是可移植的并且定義良好

TA貢獻(xiàn)1946條經(jīng)驗 獲得超3個贊
我已經(jīng)開始喜歡John Ripley .incbin
基于程序集的解決方案提供的控件,現(xiàn)在使用一個變體。
我使用objcopy(GNU binutils)將文件foo-data.bin中的二進(jìn)制數(shù)據(jù)鏈接到可執(zhí)行文件的數(shù)據(jù)部分:
objcopy -B i386 -I binary -O elf32-i386 foo-data.bin foo-data.o
這為您提供了一個foo-data.o
可以鏈接到可執(zhí)行文件的目標(biāo)文件。C界面看起來像
/** created from binary via objcopy */extern uint8_t foo_data[] asm("_binary_foo_data_bin_start");extern uint8_t foo_data_size[] asm("_binary_foo_data_bin_size");extern uint8_t foo_data_end[] asm("_binary_foo_data_bin_end");
所以你可以做類似的事情
for (uint8_t *byte=foo_data; byte<foo_data_end; ++byte) { transmit_single_byte(*byte);}
要么
size_t foo_size = (size_t)((void *)foo_data_size);void *foo_copy = malloc(foo_size);assert(foo_copy);memcpy(foo_copy, foo_data, foo_size);
如果您的目標(biāo)體系結(jié)構(gòu)對存儲常量和可變數(shù)據(jù)的位置有特殊約束,或者您希望將該數(shù)據(jù)存儲在.text
段中以使其適合與程序代碼相同的內(nèi)存類型,則可以objcopy
更多地使用這些參數(shù)。
添加回答
舉報