У меня возникли проблемы с текстовым файлом, помеченным как двоичный.

У меня возникли проблемы с текстовым файлом, помеченным как двоичный.

У меня есть исполняемый файл, который генерирует текстовый файл в качестве своего вывода. Проблема в том, что текстовый файл выводится с каким-то флагом двоичного файла. Результат примерно такой:

$ grep "grep string" output_file.txt
Binary file output_file.txt matches.

$ grep -a "grep string" output_file.txt
[correct results]

Некоторые данные указывают на то, что grep ищет нулевой символ в первой тысяче байтов, а затем по нему определяет, является ли файл «двоичным», поэтому мой вопрос состоит из двух частей:

  1. Есть ли простой способ удалить нулевые символы из моих файлов (я могу сделать это в ходе постобработки), чтобы grep работал правильно без флага -a?

  2. Есть ли что-то очевидное, на что мне следует обратить внимание в моем коде, чтобы предотвратить запись нулевых символов в файл? Я довольно тщательно просмотрел код и не вижу никаких очевидных виновников.

    .

решение1

Я могу ответить по крайней мере на первый вопрос. Если вы используете Unix/Linux, вы можете использовать tr

tr -d '\000' < filein > fileout

где \000 — это нулевой символ. Вы также можете удалить все непечатаемые символы, как вы можете видеть в примере здесь:«Редактирование текста в Unix: sed, tr, cut, od, awk»

Что касается вашего второго вопроса, я не знаю, какой у вас язык программирования, но я бы поискал неинициализированные переменные, которые можно было бы вывести в выходной файл.

решение2

Я собираюсь сделать предположение...

Ваша программа записывает файл в UTF-16, кодировке Unicode, которая использует два байта для каждого символа. Каждый второй байт, в большинстве случаев, является нулем.

iconv -f utf-16 -t utf-8 < filein > fileout

преобразует его в UTF-8, с которым большинство coreutils работают нормально.

решение3

Другим вариантом может быть использованиеструныинструмент, который на самом деле даже более мощный, чем просто «исправить» кодировку или нулевые символы, он может извлекать текстовые данные из любого реального двоичного файла, поэтому

$ strings выходной_файл.txt | grep "grep string"

обычно очень удобно быстро найти что-то в двоичном файле, например

$ strings firmware.bin | grep ВЕРСИЯ

Связанный контент