如何处理二进制数据中的 Windows/Unix EOF 警告?
How to work with Windows/Unix EOF warnings in binary data?
我正在做 cmp -l file.bin file2.bin
但开始得到 cmp: EOF on file 并怀疑 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
您在第 0435660 行中看到 \r \n
的一个输出。
总计 11 matches on 11 lines
当总行 60 个字符为 0571520 时。
所以似乎有 Windows 行尾 0.001% 的文件内容,这比正常情况下要小得多。
只是少数文件有这个问题,原始数据源没有。
这表明我这是数据处理中的问题。
这足以确认这些结尾是 Windows 行结尾吗?
我的文件包含事件,每个事件的长度都应该固定。
所以我不确定 dos2unix
在这里的效果如何,因为我无法更改事件的长度。
我想我需要删除那些具有 Windows 行尾的事件或将 windows EOF \r\n
替换为 [=18=]\n
。
但是,我不确定是否可以通过将文字字符串添加到内容中而不更改某些事件的长度来做到这一点。
情况是,如果我更改某些事件的长度,系统将停止工作。
如何处理二进制数据中的 Windows/Unix EOF 警告?
cmp: EOF on file 的可能原因是文件长度不同。
-l, --verbose
Output the (decimal) byte numbers and (octal) values of all differing bytes, instead of the default standard output. Also, output the EOF message if one file is shorter than the other. ref
cmp
命令打印一条消息:
cmp: EOF on
较短文件
如果一个文件是另一个文件的前缀,即,如果一个文件比另一个短和,则较短的文件是与较长文件的开头相同。
如果两个文件的长度不同,但较短的文件不是较长文件的前缀,cmp
将报告它们不同的第一个字节偏移量,而不会发出 EOF 警告。
在我的系统上,cmp(1)
手册页没有提到这一点,但它提到了完整的文档,确实如此。
如果 GNU diffutils
信息文档没有安装,或者配置不正确,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 中。要查看您 运行 的 GNU cmp
版本,请键入 cmp --version
。 (该行为一直存在;文档已更新以反映它。)
OSX cmp(1)
man page也是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
阅读
中的手册
info diff
并浏览到 cmp 部分。
但是,OSX 10.10.3 和 Redhat Linux 变体中的 GNU 和 BSD 手册仍然不完整。
我正在做 cmp -l file.bin file2.bin
但开始得到 cmp: EOF on file 并怀疑 Windows/Linux 行结束问题
来自 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
您在第 0435660 行中看到 \r \n
的一个输出。
总计 11 matches on 11 lines
当总行 60 个字符为 0571520 时。
所以似乎有 Windows 行尾 0.001% 的文件内容,这比正常情况下要小得多。
只是少数文件有这个问题,原始数据源没有。
这表明我这是数据处理中的问题。
这足以确认这些结尾是 Windows 行结尾吗?
我的文件包含事件,每个事件的长度都应该固定。
所以我不确定 dos2unix
在这里的效果如何,因为我无法更改事件的长度。
我想我需要删除那些具有 Windows 行尾的事件或将 windows EOF \r\n
替换为 [=18=]\n
。
但是,我不确定是否可以通过将文字字符串添加到内容中而不更改某些事件的长度来做到这一点。
情况是,如果我更改某些事件的长度,系统将停止工作。
如何处理二进制数据中的 Windows/Unix EOF 警告?
cmp: EOF on file 的可能原因是文件长度不同。
-l, --verbose
Output the (decimal) byte numbers and (octal) values of all differing bytes, instead of the default standard output. Also, output the EOF message if one file is shorter than the other. ref
cmp
命令打印一条消息:
cmp: EOF on
较短文件
如果一个文件是另一个文件的前缀,即,如果一个文件比另一个短和,则较短的文件是与较长文件的开头相同。
如果两个文件的长度不同,但较短的文件不是较长文件的前缀,cmp
将报告它们不同的第一个字节偏移量,而不会发出 EOF 警告。
在我的系统上,cmp(1)
手册页没有提到这一点,但它提到了完整的文档,确实如此。
如果 GNU diffutils
信息文档没有安装,或者配置不正确,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 中。要查看您 运行 的 GNU cmp
版本,请键入 cmp --version
。 (该行为一直存在;文档已更新以反映它。)
OSX cmp(1)
man page也是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
阅读
中的手册info diff
并浏览到 cmp 部分。 但是,OSX 10.10.3 和 Redhat Linux 变体中的 GNU 和 BSD 手册仍然不完整。