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:
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?
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