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

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

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

swab   swap every pair of input bytes

为什么?


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

答案1

因为这就是它最初的目的。用的话来说道格拉斯·麦克罗伊,他是创建 Unix 的团队的负责人UNIX 研究读物:《程序员手册》的带注释摘录,1971-1986 年:

DD(v5 第 74 页)

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

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

EBCDIC是 IBM 机器上使用的字符编码。它同样重要ASCII码当时。 ASCII 和 EBCDIC 都将字符编码为 8 位字节。 IBM 和 DEC 机器都有 16 位字。 (实际上还有其他字大小,尤其是 18 和 36,但dd在编写时考虑了 16 位字。)该目的的现代模拟将使用图标

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

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

或许更确切地说是一系列编码,但这与这里无关。

相关内容