Est-il sûr d'utiliser des entrées et sorties standard avec des données binaires?

14

J'ai besoin de diviser un fichier binaire en deux. Je me demandais si la tête et / ou la queue pouvaient être utilisées mais ensuite je me suis demandé ... est-il sûr d'utiliser la redirection, la tuyauterie, etc. avec des données binaires? Est-ce que les nouvelles lignes sont gâchées, ou les valeurs nulles ignorées, ou le retour arrière ou la suppression fait quelque chose de spécial? (bash, kubuntu 18.04 LTS)

B.Tanner
la source
1
Jetez un oeil à la splitcommande.
egmont

Réponses:

19

Oui, c'est sûr si vous le redirigez vers un autre processus ou l'enregistrez dans un fichier. Il y a une "bizarrerie" potentielle si vous laissez la sortie standard binaire imprimer sur un terminal car elle peut contenir des séquences d'échappement (au hasard) qui peuvent temporairement gâcher l'affichage du terminal.

Eric Mintz
la source
6
Dans ce cas, vous pouvez taper resetet appuyer sur Entrée pour le corriger.
Baard Kopperud
4
@BaardKopperud Je pensais avoir lu quelque part des cas de coin où tset / reset ne fonctionnerait pas
Xen2050
1
@ Xen2050 je ne sais pas. le seul cas qui se produirait si une séquence d'échappement modifie la disposition / l'encodage du clavier, de sorte que la frappe reset<enter> ne tape pas réellement cette séquence de caractères telle que vue par le terminal ...
Bakuriu
3
Voir aussi Fix terminal après l' affichage d' un fichier binaire et Pourquoi le besoin de console parfois une réinitialisation après CTRL + C . Comme suggéré dans le premier lien, la stty sane; tput rs1séquence de commandes fera l'affaire quand il y a des cas de coin de resetne pas fonctionner. De tels cas, en plus de ceux mentionnés par Bakuriu, pourraient inclure la largeur de la ligne / des colonnes du terminal ou je devine les paramètres liés à la communication série (vitesse de transmission / parité).
Sergiy Kolodyazhnyy
1

Le principal problème avec l'utilisation de commandes comme headou tailest qu'elles sont orientées ligne et que les fichiers binaires ne le sont pas. S'ils contiennent des sauts de ligne, ils ne sont souvent pas utilisés pour représenter la fin d'une ligne et s'ils le sont, ils peuvent simplement faire partie de chaînes comme des messages de programme ou des champs de données.

Si les données sont structurées de quelque manière que ce soit, vous devez en tenir compte dans le choix des points de partage afin de ne pas casser les structures au milieu.

Si vous connaissez la structure du fichier, vous pouvez utiliser une commande telle que

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

avec des options pour copier uniquement autant de blocs de données d'une taille spécifique à partir d'un décalage particulier (incrémenté) dans le fichier.

Il semble que la splitcommande mentionnée par @egmont automatisera ce processus pour vous, mais elle semble être orientée ligne par défaut, vous devrez donc spécifier des options supplémentaires telles que --bytes countlui indiquer la taille de chaque élément du fichier. être.


En guise de remarque, si vous ne savez pas ce qu'il y a dans un fichier, mais que vous pensez qu'il contient au moins des données textuelles significatives, la stringscommande est un excellent moyen de jeter un premier coup d'œil pour voir de quoi vous parlez.

strings -n 6 file | less

trouvera toutes les séries de caractères imprimables d'au moins six caractères et les affichera dans un téléavertisseur afin qu'ils ne volent pas sur le terminal. L'utilisation d'un nombre un peu plus grand que la valeur par défaut de 4 caractères permet d'éliminer de minuscules extraits de données qui se trouvent être imprimables, mais qui ne sont pas utilisés de cette façon dans le fichier.

Si vous devez ultérieurement explorer le fichier plus en détail avec un éditeur binaire tel que hexedit, vous aurez des repères qui indiquent où quelque chose d'intéressant pourrait être trouvé.

stringsa une option - t x qui précédera chaque chaîne imprimée avec son décalage dans le fichier en hexadécimal (o pour octal / d pour décimal) afin que vous sachiez où le trouver plus tard. Même les fichiers très courts sont beaucoup à traiter lorsque vous devez les regarder caractère par caractère.

Joe
la source