Shellで文字列のバイナリ表現を取得する方法は?

Shellで文字列のバイナリ表現を取得する方法は?

openssl dgst -sha1 -binaryバイナリ形式で文字列のハッシュ値を取得するために使用しています。

-binary私のバージョンのopensslは基本的に各ハッシュ値の出力の前に "stdout"を追加してそれを防ぐのに役立ちますので、さらなる処理のためにハッシュ結果をバイナリ形式で保存する方が簡単なので、フラグを使用しています(したがって使用します)とき-binaryxxd -p動作します)。stdout

openssl dgst -sha1 -binaryしたがって、Cygwinコンソールの「Hello!」バイナリ出力文字列は次のとおりです。

この結果を使用して新しい変数を作成し、値がバイナリ型以外の変数(「World」など)と関連付けられます。今私の新しい変数は次のようになります。

_▒ "Q▒%▒a▒▒▒▒.&c ▒0n▒q▒▒vh & 8iworld

次に、この接続文字列の別のハッシュを生成し、それをデフォルトのJavaハッシュライブラリ()を使用して取得したハッシュと比較しますMessageDigest。しかし、この段階では、シェルとJavaで取得したハッシュ値が一致しません(Java側で作成したものとまったく同じ値を取得する必要があります)。

したがって、私はJavaハッシュ出力と一致するように "World"文字列もバイナリ形式でなければならないと思いました(接続されたバイナリ値のハッシュを生成する限り、すべてのハッシュが一致するため)。しかし、シェルで "World"文字列をバイナリ形式に変換する方法がわかりません。どんなアイデアがありますか?

答え1

君は保存できないバイナリ変数内のデータ(バイナリデータは通常有効な文字を形成しますが、特殊でないバイト値だけでなく任意のバイト値を持つデータも表します)、変数にバイト値を格納することはサポートされていないbashためbash0文字列を渡すことができますなしを覚えておいてください)NULで区切られた文字列なので、このようなコマンド引数に使用されます。

zshしかし、入ることはできます。また、コマンド置換は末尾の改行(0xaバイト、Cygwinでは異なる場合があります)を削除するため、readここで使用するのが最善です。

$ echo 323 | openssl dgst -sha1 -binary | hd
00000000  3a 8b 03 4a 5d 00 e9 07  b2 9e 0a 61 b3 54 db 45  |:..J]......a.T.E|
00000010  63 4b 37 b0                                       |cK7.|
00000014

0バイトと改行文字(0xa)の両方がどのように含まれているかを確認してください。

$ echo 323 | openssl dgst -sha1 -binary | IFS= LC_ALL=C read -ru0 -k20 var &&
  var=${var}World
$ printf %s $var | hd
00000000  3a 8b 03 4a 5d 00 e9 07  b2 9e 0a 61 b3 54 db 45  |:..J]......a.T.E|
00000010  63 4b 37 b0 57 6f 72 6c  64                       |cK7.World|
00000019

この変数は組み込みコマンド(printf...)にのみ渡すことができることに注意してください。

もう欲しいものが再ハッシュするだけなら、

(echo 323 | openssl dgst -sha1 -binary; printf %s World) |
  openssl dgst -sha1 -binary

変数は必要ありません。

関連情報