GNU/Linux >> Tutoriels Linux >  >> Linux

Un environnement de type shell pour le traitement binaire ?

Cette question m'est venue plusieurs fois auparavant, maintenant en réponse à la question
Parcourir des morceaux de données binaires de stdin dans Bash
Réponses données dans https://stackoverflow.com/questions/993434/what -language-is-to-binary-as-perl-is-to-text n'était pas non plus satisfaisant.

Je recherche un environnement de script adapté spécifiquement pour gérer les E/S avec des fichiers binaires. Je sais que je peux utiliser l'un des langages de programmation à part entière (c/Python/…) mais ils ont une énorme surcharge d'initialisation et de codage (allocation et fread/fwrite en c, chaînes de bits en Python…) sans compter qu'ils sont moins adaptés pour les scripts (appelant d'autres applications à partir de celui-ci). Perl n'est pas meilleur avec son unpack fonctions, opération orientée chaîne et syntaxe loufoque.

Quelque chose comme od , mais en tant que langage.

Ce que j'attends :

  1. définir ou modifier l'endianité avec un seul commutateur/commande.
  2. spécification simple du type demandé (quelque chose comme étendre bash read var avec int32 var , float var etc.).
  3. gestion des binaires via des canaux, en sautant le nombre d'octets spécifié.
  4. contrôle de flux de script standard (for/if/…) auquel nous sommes habitués.

J'aimerais traiter des données brutes (photographie, données scientifiques, formats inconnus et mal documentés) avec la même facilité et la même perspicacité que lorsque vous inspectez des fichiers ASCII. J'utilise c maintenant, mais ce n'est pas optimal pour les scripts ad hoc et ne peut pas être interactif.

Est-ce que quelqu'un connait un tel outil ? Pas de logiciel d'interface graphique cliquable, s'il vous plaît, il doit fonctionner sur ssh, à partir d'autres scripts, etc. "N'existe pas" est une réponse acceptable, mais déprimante.

Réponse acceptée :

J'ai exactement le même problème que vous depuis des années.

Pour des utilisations simples non interactives, j'aime utiliser l'éditeur de blocs binaires BBE.
BBE est au binaire ce que SED est au texte, y compris sa syntaxe archaïque et sa simplicité, cependant, il manque beaucoup de fonctionnalités à ce que j'ai souvent besoin, je dois donc le combiner avec d'autres outils. Ainsi, BBE n'est qu'une solution partielle.
Notez également que BBE n'a pas eu de mises à jour ou d'améliorations depuis des années.

Bien sûr, on peut utiliser xxd avant et xxd -r après avoir modifié les données avec des outils textuels, mais cela ne fonctionnera pas lorsque les données en question sont volumineuses et qu'un accès aléatoire est requis, par exemple lors du traitement de périphériques en mode bloc.

(Remarque :pour Windows, il existe au moins le langage de script WinHex propriétaire et coûteux, mais cela ne nous mènera nulle part.)

Pour une édition binaire plus compliquée, je me rabats généralement sur Python également, même s'il est parfois trop lent pour les fichiers volumineux, ce qui en est le principal inconvénient. J'espère que Pyston (Python utilisant LLVM pour compiler en code machine optimisé) sera un jour suffisamment mature pour être utilisable, ou mieux encore, quelqu'un concevra et implémentera un langage de script de traitement binaire gratuit, compact, rapide et polyvalent, pour lequel AFAIK n'existe pas Systèmes similaires à U*IX.

En relation :Traiter les descendants ?

MISE À JOUR

J'utilise aussi l'homebrew, l'assembleur plat open source Intel x86, ou fasm en abrégé, qui est devenu bien plus qu'un simple assembleur.

Il dispose d'un puissant préprocesseur de macros basé sur des blocs de texte (lui-même un langage complet de turing) avec une syntaxe dans la tradition du langage de macros borland turbo assembleur, mais beaucoup plus avancé.

En outre, il dispose d'un langage de manipulation de données, qui permet d'inclure des fichiers binaires arbitraires, d'effectuer toutes sortes de manipulations binaires et arithmétiques (entiers uniquement) au « moment de la compilation » et d'écrire le résultat dans un fichier de sortie. Ce langage de manipulation de données a des structures de contrôle et est également en train de devenir complet.

Il est beaucoup plus facile à utiliser que d'écrire un programme qui effectue des manipulations binaires en C et probablement même en python. De plus, il se charge à une vitesse fulgurante, car il s'agit d'un exécutable de petite taille sans presque aucune dépendance externe (il existe 2 versions :soit il ne nécessite que libc, soit il peut s'exécuter en tant qu'exécutable statique directement sur l'ABI du noyau Linux).

Il a des bords de collerette, comme

  1. ne prend pas en charge la simultanéité

  2. étant écrit en assemblage x86 32 bits (fonctionne sur x86_64 cependant), vous avez probablement besoin de qemu ou d'un émulateur similaire si vous voulez l'exécuter sur autre chose que x86 ou x86_64

  3. son puissant langage de préprocesseur de macros est complet, cela signifie que vous feriez mieux d'avoir une certaine expérience avec des langages comme Lisp, Haskell, XSLT, ou probablement M4 serait le meilleur choix.

  4. toutes les données qui doivent être écrites dans le fichier de sortie sont exécutées dans un tampon "plat" en mémoire, et ce tampon peut croître mais pas rétrécir jusqu'à ce que le fichier de sortie ait été écrit et que fasm se soit terminé. Cela signifie que l'on ne peut générer des fichiers qu'au maximum de la taille de la mémoire principale restante en une seule exécution de fasm.

  5. les données ne peuvent être écrites que dans un seul fichier de sortie pour chaque exécution de fasm

  6. ouais, c'est de l'homebrew, vraiment chouette et astucieux


Linux
  1. MySQL - Conversion en données par table pour InnoDB

  2. RAID pour ceux qui l'évitent

  3. Vérification des variables d'environnement

  4. copy_to_user() et copy_from_user() pour le type de données de base

  5. Arch Linux est-il adapté à l'environnement serveur ?

Où les variables d'environnement doivent-elles être définies pour Jenkins ?

Qu'est-ce qu'une base de données distribuée et à quoi servent les systèmes de données distribués ?

Comment installer Anaconda sur Linux pour la science des données gagne !

Les 20 meilleurs logiciels d'exploration de données pour Linux Desktop

Les 10 meilleurs widgets KDE Plasma pour l'environnement de bureau KDE

15 meilleurs gestionnaires de compression ou d'archivage pour le système Linux