web-dev-qa-db-ja.com

バイナリから16進数への変換とその逆

バイナリファイルが与えられた場合、sedがインストールされている最小限のシステムで、cutbusyboxなどの標準ツールのみを使用して、16進文字列に変換したり、元に戻したりするにはどうすればよいですか?

これらのツールはnotが利用可能です:

  • Perl
  • python
  • xxd(vimに付属)
  • gcc

hexdumpコマンドにはbusyboxが付属していますが、util-linuxに付属するコマンドとは異なります。

ファイルを16進文字列に変換するためのスクリプトまたはコマンドと、それをバイナリに変換するための対応するものを探しています。中間形式は16進数である必要はありません。base64またはその他の形式にすることができます。

これは、限られたディスク容量の組み込みデバイス用です。

7
Alexander

これが私が思いついたものです(いくつかのオンラインソースといくつかの実験に基づいています)。

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未満)に対してのみ機能します。

10
Alexander

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でリストします。

2
meuh