dos2unix 修改二进制文件 - 为什么

dos2unix modifies binary files - why

默认情况下,它不应该影响二进制文件。

我在一个包含图像的文件夹中对其进行了测试,虽然大多数图像没有受到影响,但也有一些受到了影响。如果 dos2unix 不能区分二进制文件和文本文件,我必须求助于特别包括 and/or 排除某些文件扩展名才能正常工作吗?

注意:当我 运行 file image.jpg 在任何 jpg 上时,无论它是否被修改,结果是:

JPEG image data, JFIF standard 1.01

这是dos2unix程序源码的相关部分:

if ((ipFlag->Force == 0) &&
      (TempChar < 32) &&
      (TempChar != 0x0a) &&  /* Not an LF */
      (TempChar != 0x0d) &&  /* Not a CR */
      (TempChar != 0x09) &&  /* Not a TAB */
      (TempChar != 0x0c)) {  /* Not a form feed */
        RetVal = -1; 
        ipFlag->status |= BINARY_FILE ;
        if (ipFlag->verbose) {
          if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
          d2u_fprintf(stderr, "%s: ", progname);
          d2u_fprintf(stderr, _("Binary symbol 0x00%02X found at line %u\n"),TempChar, line_nr);
        }
        break;
      } 

好像是如果文件有其他控制符就认为是二进制文件,跳过,否则就作为文本文件处理。因此,如果二进制文件(例如图像)不包含这些字符,它将被损坏。

原则上没有 "binary" 或 "text" 文件之类的东西 - 所有文件都只是一个字节序列。

大多数尝试检测它们的程序只是使用某种启发式方法来排除包含文本中不常见字符(通常字符 < 32)或不包含文本中通常存在的字符(例如,空格,如@Andrey 的回答所示)。

这只是为了避免意外错误而对您做的好事,但是 "without warranty of any kind",因为完全有可能 "binary" 文件只使用 ASCII 字符(它很容易构建,比如, PPM 和 COM 文件通过上述测试)。