Ich habe Probleme mit einer Textdatei, die als Binärdatei markiert ist

Ich habe Probleme mit einer Textdatei, die als Binärdatei markiert ist

Ich habe eine ausführbare Datei, die als Ausgabe eine Textdatei generiert. Das Problem besteht darin, dass die Textdatei mit einer Art Binärdateiflag ausgegeben wird. Das Ergebnis sieht ungefähr so ​​aus:

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

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

Aus einigen Lektüren geht hervor, dass grep in den ersten tausend Bytes oder so nach einem Nullzeichen sucht und dann daraus ermittelt, ob eine Datei „binär“ ist oder nicht. Meine Frage ist also zweigeteilt:

  1. Gibt es eine einfache Möglichkeit, Nullzeichen aus meinen Dateien zu entfernen (ich kann dies als Teil meiner Nachbearbeitung tun), um sicherzustellen, dass grep ohne das Flag -a ordnungsgemäß funktioniert?

  2. Gibt es etwas Offensichtliches, auf das ich in meinem Code achten sollte, um zu verhindern, dass Nullzeichen in die Datei geschrieben werden? Ich habe den Code gründlich durchgesehen und sehe keine offensichtlichen Übeltäter.

    .

Antwort1

Ich kann zumindest die erste Frage beantworten. Wenn Sie Unix/Linux verwenden, können Sie tr verwenden

tr -d '\000' < filein > fileout

wobei \000 das Nullzeichen ist. Sie können auch alle nicht druckbaren Zeichen entfernen, wie Sie im Beispiel hier sehen können:„Unix-Textbearbeitung: sed, tr, cut, od, awk“

Zu Ihrer zweiten Frage: Ich weiß nicht, welche Ihre Programmiersprache ist, aber ich würde nach nicht initialisierten Variablen suchen, die möglicherweise in die Ausgabedatei gedruckt werden.

Antwort2

Ich wage eine Vermutung …

Ihr Programm schreibt die Datei in UTF-16, einer Unicode-Kodierung, die für jedes Zeichen zwei Bytes verwendet. Jedes zweite Byte ist meistens eine Null.

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

konvertiert es in UTF-8, womit die meisten Coreutils vertraut sind.

Antwort3

Eine weitere Möglichkeit wäre die VerwendungSaitenTool, das eigentlich noch leistungsfähiger ist als nur die Kodierung oder Nullzeichen zu "korrigieren", es kann Textdaten aus jeder echten Binärdatei abrufen, also

$ strings Ausgabedatei.txt | grep "grep-Zeichenfolge"

normalerweise recht praktisch, um schnell etwas in einer Binärdatei zu finden, z. B.

$ strings firmware.bin | grep VERSION

verwandte Informationen