バイナリから16進数への変換とその逆
バイナリファイルが与えられた場合、sed
がインストールされている最小限のシステムで、cut
やbusybox
などの標準ツールのみを使用して、16進文字列に変換したり、元に戻したりするにはどうすればよいですか?
これらのツールはnotが利用可能です:
Perl
python
xxd
(vimに付属)gcc
hexdump
コマンドにはbusybox
が付属していますが、util-linux
に付属するコマンドとは異なります。
ファイルを16進文字列に変換するためのスクリプトまたはコマンドと、それをバイナリに変換するための対応するものを探しています。中間形式は16進数である必要はありません。base64またはその他の形式にすることができます。
これは、限られたディスク容量の組み込みデバイス用です。
これが私が思いついたものです(いくつかのオンラインソースといくつかの実験に基づいています)。
16進数からビン(hex2bin
):
#!/bin/sh
sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' "$1" | xargs printf
ビンから16進数(bin2hex
):
#!/bin/sh
hexdump -v -e '1/1 "%02x"' "$1"
使用例:
./bin2hex binary_file_1 | ./hex2bin - > binary_file_2
diff -s binary_file_1 binary_file_2
これはbusyboxで機能しますが、hex2binはxargs
に指定された引数の最大長によって制限されているため、この方法は小さなファイル(デスクトップシステムでは32 KiB未満)に対してのみ機能します。
Busyboxはアプレットbase64で構築されている可能性があるため、
busybox base64 <bin >txt
busybox base64 -d <txt >bin
または、そうでない場合は、由緒あるencodeおよびdecodeを使用できます。これらには、16進数でエンコードする-m
オプションも使用できます。例えば
echo -n abcABC | busybox uuencode -m - | busybox uudecode -
組み込みアプレットをbusybox --list
でリストします。