xxd -r -pは何をしますか?

xxd -r -pは何をしますか?

そのため、受信した添付ファイルのSHA1ダイジェストを計算し(base64エンコード)、ダイジェストと一致するようにします。 ChatGPTを使用して以下のコマンドを正常に使用できました。しかし、私はこのコマンドxxd -r -pがなぜ必要なのか理解していません。

sha1sum foo | awk '{print $1}' | xxd -r -p | base64

私が理解していない2つのことがあります。

  1. なぜこのオプションが-p必要ですか? 16進ダンプのバイナリダンプを実行する方法を知っていますが、xxd -r印刷しないと-p何も印刷されず、マニュアルページにはstdoutとして印刷する必要があることがわかります。これは-p特定の出力スタイルでのみ機能します。
  2. SHA1ダイジェストを渡す目的は何ですかxxd?私の理解は、xxd本質的に16進数と2進数の間でデータを変換することです。ただし、を使用せずに上記のコマンドを実行すると、異なるxxd -r -p一致しない出力が表示されます。私は16進スタイル/表現(SHA1ダイジェストの形式)が何であるかを知っていますが、この文脈で「バイナリ」が何を意味するのかわかりません。

答え1

xxd -r pまず、私たちが扱っていることを理解するために入力を見てみましょう。例は次のとおりです。

echo boo | sha1sum | awk '{print $1}'
6132b58967cf1ebc05062492c17145e5ee9f82a8

この行は、次の SHA1 ハッシュを生成します。4つ文字booとその末尾の改行文字。

xxdそれでは、このコマンドを少し勉強しましょう。xxdのマニュアルページ(参考資料を参照)では、man xxdこのxxd -rコマンドがで生成された一般的な16進ダンプを元に戻すことを説明しますxxd。したがって、次のパイプラインを構築できます。

echo boo | xxd | xxd -r
boo

それでは、次の2つの出力を比較してみましょう。

echo boo | xxd
00000000: 626f 6f0a                                boo.

echo boo | xxd -p
626f6f0a

2番目の出力をバイナリに反転するには、次のものが-r必要です-p

echo boo | xxd -p | xxd -r -p
boo

スペースやその他の形式なしで16進バイトで生成されたこの構造は、の出力とxxd -p正確に一致するため、sha1sumこの方法を使用してバイナリに変換できます。次に(最終的に)結果バイナリを渡してBase 64にbase64変換します。

echo boo | sha1sum | awk '{print $1}' | xxd -r -p | base64
YTK1iWfPHrwFBiSSwXFF5e6fgqg=

関連情報