6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

バイナリファイルを32bit整数の配列としてC++ソースコードに埋め込みたい(Vulkan SPIR-Vとか)

Posted at

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でも似たようなことができるが、変数名とかが勝手についてくる上、出力される形式はコンパイル時定数ではないので、ソースコードへの埋め込みという点ではこの方法がより優れていると言える。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?