二进制文件的行数是什么意思?

What does a line count of a binary file mean?

:~$ wc -l bitmap.bmp
12931 bitmap.bmp

我猜二进制文件就像一个流,上面没有行。那么当你谈论二进制文件中的行时,它是什么意思?

(注意:"wc -l"计算一个文件的行数)

Alex Taylor 在下面指出,正如我所怀疑的那样,wc 正在计算文件中 /n 个字符的数量。

所以问题就变成了: 当 wc 将二进制文件转换为文本时,wc 发现的 '\n' 字符是随机存在的,还是实际上存在于二进制文件中?比如 b'\n'(在 Python 中)?如果是,为什么有人会在二进制文件中使用换行符?

数据中换行符('\n')的个数

查看 source code for MacOS' wc,我们看到以下代码:

if (doline) {
    while ((len = read(fd, buf, buf_size))) {
        if (len == -1) {
            warn("%s: read", file);
            (void)close(fd);
            return (1);
        }
        charct += len;
        for (p = buf; len--; ++p)
            if (*p == '\n')
                ++linect;
    }

它对文件进行缓冲读取,然后循环遍历数据,如果找到“\n”则递增计数器。

GNU version of wc 包含类似的代码:

/* Increase character and, if necessary, line counters */
#define COUNT(c)       \
      ccount++;        \
      if ((c) == '\n') \
        lcount++;

至于为什么二进制文件中有换行符,它们只是另一个值(0x0A最常见的OS') .除非文件被解释为文本文件,否则字符没有什么特别之处。同样,制表符、数字和所有其他 'text' 字符也将出现在二进制文件中。这就是为什么在二进制文件上使用 cat 会导致终端发出疯狂的哔哔声——它试图显示 BEL 字符 (0x07)。文本只是约定俗成的文本。