xxd -r -p 有什么作用?

xxd -r -p 有什么作用?

因此,我尝试为我收到的附件计算 SHA1 摘要(并对其进行 base64 编码),以便它与它们的(base64 编码)摘要相匹配。使用 ChatGPT,我能够使用下面的命令来成功。但我不明白这个命令xxd -r -p或为什么有必要。

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

有两件事我不明白:

  1. 为什么-p需要该选项?我知道xxd -r对十六进制转储进行二进制转储,但如果我不打印它,那么-p它不会打印任何内容,而手册页说它应该打印到标准输出,而这-p仅适用于特定的输出样式。
  2. 传递 SHA1 摘要的目的是什么xxd?我的理解xxd本质上是在十六进制和二进制之间转换数据。但是当我在没有 的情况下运行上述命令时xxd -r -p,它会给出不同的且不匹配的输出。我确实知道十六进制样式/表示是什么(这是 SHA1 摘要的格式),但也许我不知道“二进制”在这种情况下意味着什么?

答案1

首先,查看输入以xxd -r p了解我们正在处理的内容。这是一个例子:

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

此行生成以下内容的 SHA1 哈希值字符boo及其尾随换行符。

现在让我们xxd稍微研究一下该命令。xxd(请参阅 参考资料)的手册页man xxd解释了该xxd -r命令反转由 生成的正常十六进制转储xxd。所以我们可以构建这样的管道:

echo boo | xxd | xxd -r
boo

现在对比这两个输出:

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

echo boo | xxd -p
626f6f0a

要将第二个输出反转为二进制,我们不仅-r需要-p

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

此结构(由 生成的不带空格或其他格式的十六进制字节xxd -p)恰好与 的输出匹配sha1sum,这就是为什么可以使用此方法将其转换为二进制。然后(最终!)将生成的二进制文件传递给base64,将其转换为 Base 64:

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

相关内容