Ist es sicher, Standardeingabe und -ausgabe mit Binärdaten zu verwenden?


14

Ich muss eine Binärdatei in zwei Teile aufteilen. Ich habe mich gefragt, ob Kopf und / oder Schwanz verwendet werden könnten, aber dann habe ich mich gefragt ... ist es sicher, Umleitung, Piping usw. mit Binärdaten zu verwenden? Werden neue Zeilen durcheinander gebracht oder werden Nullen ignoriert oder Rücktaste oder Löschen tun etwas Besonderes? (bash, kubuntu 18.04 LTS)


1
Schauen Sie sich den splitBefehl an.
egmont

Antworten:


19

Ja, es ist sicher, wenn Sie es an einen anderen Prozess weiterleiten oder in einer Datei speichern. Es besteht die Möglichkeit einer "Verrücktheit", wenn Sie binäres stdout auf ein Terminal drucken lassen, da es zufällige Escape-Sequenzen enthalten kann, die die Terminal-Anzeige vorübergehend durcheinander bringen können.


6
In diesem Fall können Sie reseteingeben und die Eingabetaste drücken, um das Problem zu beheben.
Baard Kopperud

4
@ BaardKopperud Ich dachte, ich lese irgendwo über einige Eckfälle, in denen tset / reset nicht funktionieren würde
Xen2050

1
@ Xen2050 Ich weiß es nicht. der einzige Fall, der eintreten würde, wenn eine Escape-Sequenz das Tastaturlayout / die Tastaturcodierung ändert, sodass beim Tippen reset<enter> nicht die vom Terminal
angezeigte Zeichenfolge eingegeben wird

3
Siehe auch Terminal Fix nach einem Binärdatei Anzeigen und Warum funktioniert die Konsole muß manchmal einen Reset nach STRG + C . Wie im ersten Link vorgeschlagen, ist die stty sane; tput rs1Befehlssequenz hilfreich, wenn Eckfälle auftreten, in denen es resetnicht funktioniert. Solche Fälle könnten, zusätzlich zu den von Bakuriu erwähnten, die Breite der Terminalleitung / -spalten beinhalten oder ich vermute die Einstellungen in Bezug auf die serielle Kommunikation (Baudrate / Parität).
Sergiy Kolodyazhnyy

1

Das Hauptproblem bei der Verwendung von Befehlen wie headoder tailist, dass sie zeilenorientiert sind und Binärdateien nicht. Wenn sie Zeilenumbrüche enthalten, werden sie häufig nicht zur Darstellung des Zeilenendes verwendet. Wenn dies der Fall ist, sind sie möglicherweise nur Teil von Zeichenfolgen wie Programmnachrichten oder Datenfeldern.

Wenn die Daten in irgendeiner Weise strukturiert sind, müssen Sie dies bei der Auswahl der Aufteilungspunkte berücksichtigen, damit Sie keine Strukturen in der Mitte aufbrechen.

Wenn Sie die Struktur der Datei kennen, können Sie einen Befehl wie z

dd -if input-file -of output-file ...

Mit der Option, nur so viele Datenblöcke einer bestimmten Größe ab einem bestimmten (inkrementellen) Versatz in die Datei zu kopieren.

Es sieht so aus, splitals würde der von @egmont erwähnte Befehl diesen Vorgang für Sie automatisieren, aber er scheint standardmäßig zeilenorientiert zu sein, sodass Sie zusätzliche Optionen angeben müssen, um anzugeben --bytes count, wie groß die einzelnen Teile der Datei sein sollen Sein.


Nebenbei bemerkt: Wenn Sie nicht wissen, was in einer Datei enthalten ist, aber vermuten, dass sie zumindest einige aussagekräftige Textdaten enthält, können Sie mit dem stringsBefehl einen ersten Blick darauf werfen, womit Sie es zu tun haben.

strings -n 6 file | less

findet alle Serien druckbarer Zeichen mit einer Länge von mindestens sechs Zeichen und zeigt sie in einem Pager an, damit sie auf dem Terminal nicht vorbeifliegen. Wenn Sie eine Zahl verwenden, die etwas größer als die Standardeinstellung von 4 Zeichen ist, können Sie winzige Datenschnipsel entfernen, die nur gedruckt werden können, aber in der Datei nicht auf diese Weise verwendet werden.

Wenn Sie die Datei später mit einem Binäreditor wie z. B. genauer untersuchen müssen hexedit, haben Sie einige Orientierungspunkte, die darauf hinweisen, wo sich möglicherweise etwas Interessantes befindet.

stringsEs gibt eine Option t x , mit der jeder gedruckten Zeichenfolge der Offset in der Datei hexadezimal vorangestellt wird (o für Oktal / d für Dezimal), damit Sie später wissen, wo Sie ihn finden. Selbst sehr kurze Dateien sind eine Menge zu bewältigen, wenn Sie sie Zeichen für Zeichen betrachten müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.