web-dev-qa-db-fra.com

Est-il prudent d'utiliser une entrée et une sortie standard avec des données binaires?

Je dois diviser un fichier binaire en deux. Je me demandais si on pouvait utiliser la tête et/ou la queue, mais je me suis ensuite demandé ... Est-il prudent d'utiliser la redirection, la tuyauterie, etc. avec des données binaires? Est-ce que les nouvelles lignes sont gâchées avec, ou les NULL sont ignorées, ou un retour arrière ou une suppression font quelque chose de spécial? (bash, kubuntu 18.04 LTS)

13
B.Tanner

Oui, c'est sûr si vous le dirigez vers un autre processus ou si vous l'enregistrez dans un fichier. Il y a un potentiel "étrange" si vous laissez la sortie standard binaire sur un terminal, car elle peut contenir des séquences d'échappement (aléatoires) qui peuvent perturber temporairement l'affichage du terminal.

18
Eric Mintz

Le principal problème lié à l’utilisation de commandes telles que headou tailest qu’elles sont orientées ligne et que les fichiers binaires ne le sont pas. S'ils contiennent des nouvelles lignes, 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 telles que 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 lors du choix des points de partage afin de ne pas rompre 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 dans le fichier autant de blocs de données d’une taille spécifique à partir d’un offset particulier (incrémenté).

Il semble que la commande splitmentionnée par @egmont automatisera ce processus pour vous, mais il semble être orienté ligne par défaut. Vous devrez donc spécifier des options supplémentaires telles que --bytes count pour lui indiquer la taille de chaque élément du le fichier devrait être.


En remarque, si vous ne savez pas ce qu'il y a dans un fichier, mais que vous pensez qu'il contient au moins quelques données textuelles utiles, la commande stringsest un excellent moyen de jeter un premier coup d'œil à ce que vous avez à faire.

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 pager afin qu’elles ne survolent pas le terminal. L'utilisation d'un nombre un peu plus grand que le nombre par défaut de 4 caractères permet d'éliminer les petits fragments de données imprimables, mais qui ne sont pas utilisés de cette manière dans le fichier.

Si vous devez par la suite explorer le fichier plus en détail avec un éditeur binaire tel que hexeditname__, vous obtiendrez des repères qui indiqueront où trouver quelque chose d'intéressant.

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ù la trouver ultérieurement. Même les très petits fichiers sont difficiles à traiter lorsque vous devez les examiner caractère par caractère.

0
Joe