OpenCLの時のようなテキストファイルではなく、VulkanでSPIR-Vのバイナリファイルを32bit整数配列で埋め込みたい時などにどうしたらいいかメモ。
結論から言うと、元のバイナリファイルを data.bin
とすると
$ cat data.bin | hexdump -v -e '"0x" 1/4 "%08X" ",\n"' > data.txt
と変換し、これを
constexpr std::uint32_t DATA[] =
{
#include "data.txt"
};
constexpr auto DATA_LENGTH = sizeof(DATA)/sizeof(std::remove_extent_t<decltpye(DATA)>);
とすればいい。
なお、32bit(4byte)ではなく、8bitや16bitにしたい場合は以下の通り。
$ cat data.bin | hexdump -v -e '"0x" 1/1 "%02X" ",\n"' > data.txt
$ cat data.bin | hexdump -v -e '"0x" 1/2 "%04X" ",\n"' > data.txt
hexdumpの部分を一応解説しておくと、-v
はファイル全部を出力するという意味(付けないと途中省略されることがあるので必須)。-e
は後ろに続く''
内の文字列形式で出力する。""
で区切った順番で出力されるので、"0x?????,\n"
となる。????の部分は1/4 "%08X"
が該当する。これの意味は、「1つの4byteデータを"%08X"」で出力する。%08X
は普通のCのprintf
とかで出てくるやつと同じ。今回は「0埋め8文字大文字16進」の意味。なので、8bitと16bitの時は↑のようになる。
xxd -i
でも似たようなことができるが、変数名とかが勝手についてくる上、出力される形式はコンパイル時定数ではないので、ソースコードへの埋め込みという点ではこの方法がより優れていると言える。