2024/01/04(木) [n年前の日記]
#1 [prog] xxdというコマンドがあることを知った
先日、bin2c を使えば、バイナリファイルをC言語のヘッダーファイル(unsigned char配列)に変換できる ―― 例えばpngバイナリをC言語のヘッダーファイルにしてexeファイルの中に含めることができる、と分かったけれど。
その後ググっていたら、xxdなるツール? コマンド? があることを知った。この xxd を使っても、バイナリファイルをC言語のヘッダーファイルに変換できるらしい。
_【xxd】コマンド――ファイルを16進数でダンプする、ダンプから復元する:Linux基本コマンドTips(254) - @IT
_A-Liaison BLOG: xxd を使って画像などのバイナリデータをソースコードに含める方法
元々は vim に付属するツールだそうで、vim が入ってる環境なら xxd も一緒に入ってる可能性が高そうだなと…。
試しに使ってみた。環境は Windows10 x64 22H2 + MinGW(gcc 6.3.0) or MSYS2(gcc 13.2.0)。
その後ググっていたら、xxdなるツール? コマンド? があることを知った。この xxd を使っても、バイナリファイルをC言語のヘッダーファイルに変換できるらしい。
_【xxd】コマンド――ファイルを16進数でダンプする、ダンプから復元する:Linux基本コマンドTips(254) - @IT
_A-Liaison BLOG: xxd を使って画像などのバイナリデータをソースコードに含める方法
元々は vim に付属するツールだそうで、vim が入ってる環境なら xxd も一緒に入ってる可能性が高そうだなと…。
試しに使ってみた。環境は Windows10 x64 22H2 + MinGW(gcc 6.3.0) or MSYS2(gcc 13.2.0)。
◎ xxdがある場所 :
MinGW(SourceForge版、gcc 6.3.0) には入っていた。msys 1.0 側に入っている。
MSYS2 MINGW64(gcc 13.2.0) にも入っている。
vim に付属するツール、という話があったけど、MSYS2 の vim のパッケージ情報を眺めたら、たしかに一緒に入っていた。もし xxd が見つからなかったら、vim をインストールすると xxd も入るかもしれない。
_Package: vim - MSYS2 Packages
ちなみに、Ubuntu Linux のパッケージを調べたら、xxd というパッケージが独立して存在していた。sudo apt install xxd でインストールできそう。
> which xxd "D:\MinGW\msys\1.0\bin\xxd.exe" > xxd --version xxd V1.10 27oct98 by Juergen Weigert
MSYS2 MINGW64(gcc 13.2.0) にも入っている。
$ which xxd /usr/bin/xxd $ xxd --version xxd 2023-10-25 by Juergen Weigert et al.
vim に付属するツール、という話があったけど、MSYS2 の vim のパッケージ情報を眺めたら、たしかに一緒に入っていた。もし xxd が見つからなかったら、vim をインストールすると xxd も入るかもしれない。
_Package: vim - MSYS2 Packages
ちなみに、Ubuntu Linux のパッケージを調べたら、xxd というパッケージが独立して存在していた。sudo apt install xxd でインストールできそう。
◎ C言語のヘッダーファイルとして出力 :
xxd に -i オプションをつけることで、C言語のヘッダーファイルの形で出力できるらしい。そのままだと標準出力に出力されるので、「>」を使ってファイルに書き込む。
出力された内容は以下のような感じ。バイナリデータと、バイナリデータのサイズが記述されている。
先日、bin2c を使って実験していたアレコレを、xxd を使って処理できるのか試してみたけど、問題なく動いてくれた。
bin2c は別途入手しないと使えないけれど、xxd ならあらかじめ入ってる環境が多そうなので、こちらを使ったほうが良さそうだなと…。
xxd -i texture.png > texture.h
出力された内容は以下のような感じ。バイナリデータと、バイナリデータのサイズが記述されている。
unsigned char texture_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, // ... 0x10, 0x01, 0xd1, 0x1a, 0x6f, 0xdc, 0xef, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; unsigned int texture_png_len = 103208;
先日、bin2c を使って実験していたアレコレを、xxd を使って処理できるのか試してみたけど、問題なく動いてくれた。
bin2c は別途入手しないと使えないけれど、xxd ならあらかじめ入ってる環境が多そうなので、こちらを使ったほうが良さそうだなと…。
[ ツッコむ ]
以上です。