为什么 `dd` 具有 `swab` 功能

nhe*_*hed 11 dd history

dd注释选项的联机帮助页swab

swab   swap every pair of input bytes
Run Code Online (Sandbox Code Playgroud)

为什么?


不要问我想做什么——我没有特别做什么,我只是在挠头。如果要提供交换,为什么不为所有字长提供交换?不是我需要那个,但如果我们只是交换 2 个相邻字节,它必须与特定的硬件场景相关联。为什么不在手册或文档中记录info

Gil*_*il' 17

因为那是它的初衷。用创建 Unix 的团队负责人Douglas McIlroyA Research UNIX Reader: Annotated Excerpts from the Programmer's Manual, 1971-1986 中的话来说

DD (v5 第 74 页)

最初用于在 DEC 计算机的 ASCII、小端字节流世界和 IBM 的 EBCDIC、大端、阻塞世界之间转换文件,dd 被赋予了适当的混蛋语法(Thompson,v5)。派克注意到了一个文化怪癖。就像家庭延续孩子们古怪的谚语一样,用户习惯于使用 JCL 式的公式来调用dddd if=input of=output,或者也许使用cat input | dd of=output,但很少使用基本的话语dd <input >output

“v5 page 74”指的是Unix v5 手册(本 PDF 的第 51 页)。在相应的源代码也在线。

EBCDIC是 IBM 机器上使用的字符编码¹。当时它和ASCII一样重要。ASCII 和 EBCDIC 都以 8 位字节对字符进行编码。IBM 和 DEC 机器都有 16 位字。(实际上还有其他字长,尤其是 18 和 36,但dd在编写时考虑了 16 位字。)该目的的现代模拟将使用iconv

dd很快就不再重要的最初目的:它成为一种逐块复制二进制数据的方法,尤其是向或从无法逐字节访问的磁带驱动器复制。就此而言,dd今天几乎无关紧要:dd在旧的 unices 上很有用,其中诸如cat,headtail仅适用于文本文件的工具(它们逐行处理数据,因此一行必须适合少量内存,而它们没有) t 支持空字节),但在现代 unices 上,这些工具通常支持二进制文件。

无论如何,没有人发现扩展dd到其他字节顺序更改场景很有用。部分原因是随着计算机变得越来越普遍,以独立于机器的方式定义数据格式变得越来越普遍。尽管现在时不时仍然需要字节序转换,但很少在整个文件上使用它:通常只有部分数据是面向字的,而其他部分是面向字节的,需要保持原样。

¹或者更确切地说是一系列编码,但这与此处无关。

  • 特别是,`swab` 用于将 PDP-11 4 字节整数以其所谓的“中端”格式转换为大端。PDP-11 上的约定是将 0x0A0B0C0D 存储为 4 字节序列 0x0B 0x0A 0x0D 0x0C。 (4认同)
  • `cat` 什么时候只处理文本文件,并逐行处理它们?它从来没有这样做过。而且 `tail` 从一开始就支持块和字符。 (3认同)
  • `dd` 是一堆选项,但它会创建稀疏文件,转换所有字符的大小写,并将更改拼接成一个文件。现在太实用了,但以前非常有用。 (2认同)