1

我正在这样做cmp -l file.bin file2.bin,但开始得到cmp: EOF 文件和可疑的 Windows/Linux 行尾问题,如此所述。我应该按一些顺序拆分二进制数据,所以我做了一些分析。我注意到这个问题只是关于我的一些大小为 1GB 的文件。

输出自od -c file.bin

0435500  \n   <A5>  \n   Y  \n   f  \n   p  \n   <A9>  \n   A  \n   W  \n 202
0435520  \n   <B0>  \n   M  \n   t  \n 202  \n   <B1>  \n   i  \n   i  \n 227
0435540  \n 221  \n   Y  \n   ;  \n   <B2>  \n 225  \n   <  \n   J  \n 217
0435560  \n   <A9>  \n   <  \n 211  \n   <AB>  \n 201  \n   T  \n   y  \n 204
0435600  \n 212  \n   \  \n   v  \n   p  \n   |  \n   9  \n   M  \n   u
0435620  \n 214  \n   <  \n   r  \n   <A0>  \n   <AF>  \n   X  \n   W  \n 204
0435640  \n   <A5>  \n   B  \n   a  \n 207  \n   <AA>  \n   S  \n   ^  \n   |
0435660 004  \r  \n   > 003   <ED> 003   <E8>  \f   . 003   <EC>  \f   * 004 032
0435700  \f   h  \f   m  \f   i  \f   h  \n   o 004 024  \n   k  \n   <A5>
0435720  \n   <A2>  \n   =  \n   k  \n   p  \n   <B1>  \n   I  \n   ^  \n   y
0435740  \n 227  \n   <  \n   T  \n   |  \n 224  \n   8  \n   w  \n 202

\r \n在第 0435660 行看到一个输出。总共,11 matches on 11 lines当 60 个字符的总行数为 0571520 时。因此,Windows 行尾似乎占文件内容的 0.001%,这比正常情况下要小得多。只是,少数文件有这个问题,而原始数据源没有。这表明我这是数据处理中的一个问题。这足以确认这些结尾是 Windows 行结尾吗?

我的文件包含每个应该具有固定长度的事件。所以我不确定dos2unix这里的效果如何,因为我无法更改活动的长度。我想我需要删除那些具有 Windows 行尾的事件或将 Windows EOF 替换\r\n\0\n. 但是,我不确定是否可以通过将文字字符串添加到内容中而不改变某些事件的长度来做到这一点。情况是如果我更改某些事件的长度,系统就会停止工作。

如何处理二进制数据中的 Windows/Unix EOF 警告?

4

3 回答 3

2

cmp: EOF on file的可能原因是文件的长度不同。

-l, --verbose
输出所有不同字节的(十进制)字节数和(八进制)值,而不是默认的标准输出。此外,如果一个文件比另一个文件短,则输出 EOF 消息。 参考

于 2015-07-04T21:23:35.370 回答
1

cmp命令打印一条消息:

cmp: EOF on 更短的文件

如果一个文件是另一个文件的前缀,即,如果一个文件比另一个文件短并且较短的文件与较长文件的开头相同。

如果两个文件的长度不同,但较短的文件不是较长文件的前缀,cmp则将报告它们不同的第一个字节偏移量,而不会发出 EOF 警告。

在我的系统上,cmp(1)手册页没有提到这一点,但它引用了完整的文档,确实如此。

如果没有安装 GNU diffutilsinfo 文档,或者配置不正确,该info命令将退回到显示手册页。

在 CentOS 5.11(与 Red Hat 基本相同)上,info diff显示diffutils文档;导航到“Invoking cmp”会显示该cmp命令的文档。但它是旧版本的文档,缺少有关 EOF 消息的信息。(diffutils 2.8.1 手册没有提到 EOF 消息;diffutils 3.3 手册有。)检查git repo中的历史,该措辞是在 2002 年添加的,并首次包含在 2.8.2 版本中。cmp要查看您正在运行的 GNU 版本,请键入cmp --version. (这种行为一直存在;文档已更新以反映它。)

OSXcmp(1)手册页也是 GNU diffutils 版本;它指的是info文档,但它似乎也适用于版本 2.8.1,它没有提到 EOF 消息。

当前 GNU diffutils 版本的文档:http ://www.gnu.org/software/diffutils/manual/html_node/Invoking-cmp.html

POSIX 需要相同的行为: http: //pubs.opengroup.org/onlinepubs/9699919799/utilities/cmp.html

于 2015-07-04T21:33:51.593 回答
0

阅读手册

info diff

并浏览到 cmp 部分。但是,在 OSX 10.10.3 和 Redhat Linux 变体中的 GNU 和 BSD 中的手册仍然不完整。

于 2015-07-04T21:51:47.050 回答