2015-07-04 2 views
1

Я делал cmp -l file.bin file2.bin, но начал получать cmp: EOF в файле и подозревал, что проблема с завершением работы Windows/Linux, как описано here. Я должен разбить двоичные данные на некоторую последовательность, поэтому я сделал некоторое профилирование. Я заметил, что эта проблема касается только некоторых моих файлов размером 1 ГБ.Как работать с предупреждениями EOF Windows/Unix в двоичных данных?

Выход из 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, или заменить окна EOF \r\n на \0\n. Однако я не уверен, могу ли я сделать это, добавив литеральную строку в контент, не изменяя длину некоторых событий. Ситуация заключается в том, что если я изменяю длину некоторых событий, система перестает работать.

Как работать с предупреждениями EOF Windows/Unix в двоичных данных?

+3

В двоичных файлах нет строк, двоичные данные - двоичные данные. Некоторые комбинации '\ r \ n' могут быть частью более длинных двоичных последовательностей, может случиться так, что в некоторых местах есть« 0x0d »и« 0x0a ». –

+0

@JoachimPileborg Почему 'cmp -l' иногда дает такое предупреждение? Как сравнить лучшие двоичные данные? –

+0

Вы должны думать о данных, которые фактически хранятся в файлах. Мы не можем сказать, что лучше всего сравнивать, помимо команды 'cmp', поскольку мы действительно не знаем данные или формат. В файлах могут быть встроенные тексты, с или без символов новой строки, мы не знаем. –

ответ

1

В cmp команда печатает сообщение:

cmp: EOF onКОРОЧЕ-FILE

если один файл является префикс другого, то есть, если один файл короче другие и более короткий файл идентичен началу более длинного файла.

Если два файла имеют разную длину, но более короткий файл не является префиксом более длинного, то cmp будет сообщать о первом смещении байта, при котором они отличаются, без предупреждения EOF.

В моей системе справочная страница cmp(1) не упоминает об этом, но это относится к полной документации, что делает.

Если информационная документация GNU diffutils не установлена ​​или настроена неправильно, команда info возвращается к показу справочной страницы.

На CentOS 5.11 (по существу идентичный Red Hat) info diff показывает документацию diffutils; переход на «Вызов 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

+0

Да, полная документация GNU и BSD не упоминает EOF. По крайней мере, не в этих двух руководствах, а не в моих руководствах по GNU/BSD. Только в этом wikipage, источником которого является некоторая физика . Руководство POSIX неявно упоминает EOF, но не так четко, как wiki. –

+0

@ Masi: Как я уже сказал, * man-страница не работает, но полная документация GNU. Я связался с ним в своем ответе; вы также можете увидеть его в своей системе, набрав 'info cmp'. –

+0

Да, я вставлял то, что я вижу в комментарии ответа chux. Моя информация cmp> его параметры неполны. Нет упоминания EOF в BSD и Redhat Linux. На самом деле, вы должны прочитать 'info diff', а не' info cmp', поскольку он неполный. –

2

Вероятно, причина для cmp: EOF в файле заключается в том, что файлы имеют разную длину.

-l, --verbose
Output (десятичные) число байт и (восьмеричные) значения всех различающихся байт, вместо стандартного вывода по умолчанию. Также выведите сообщение EOF, если один файл короче другого. ref

+1

Последняя строка Wikipage отсутствует в руководствах GNU и BSD в 'man'. Я открыл новую тему о том, как получить лучшие руководства в OSX здесь http://apple.stackexchange.com/q/194469/15504, но такая же проблема также в моем варианте Redhat Linux. –

+0

@Masi: страница руководства не включает эту информацию, но указывает на версию руководства, которое делает (для систем, использующих версию GNU diffutils 'cmp'):« Полная документация для 'cmp' поддерживается как руководство Texinfo.Если программы 'info' и' cmp' правильно установлены на вашем сайте, команда 'info cmp' должна предоставить вам доступ к полному руководству." –

+1

@Masi [@Keith Thompson] (http://stackoverflow.com/ a/31225273/2410359) является лучшим ответом - предлагаю изменить принятый ответ. – chux

0

читать инструкции в

info diff 

и перейдите к разделам КСС. Однако все еще неполные руководства в GNU и BSD в OSX 10.10.3 и Redhat Linux.