Cette question m'est venue plusieurs fois auparavant, maintenant en réponse à la question Boucle à travers des morceaux de données binaires de stdin dans Bash Answers donnée dans /programming/993434/what-language-is-to-binary -as-perl-is-to-text n'étaient pas non plus satisfaisants.
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 charge d'initialisation et de codage (allocation et fread / fwrite en c, chaînes de bits en Python ...) sans oublier ils sont moins adaptés à l'écriture de scripts (appel à d'autres applications depuis celui-ci). Perl n'est pas meilleur avec ses unpack
fonctions, son fonctionnement orienté chaîne et sa syntaxe maladroite.
Quelque chose comme od
, mais comme une langue.
Ce que j'attends:
- définir ou modifier l'endianité avec un seul commutateur / commande.
- spécification simple du type demandé (quelque chose comme étendre bash
read var
avecint32 var
,float var
etc.). - gestion du binaire à travers des tuyaux, saut du nombre spécifié d'octets.
- contrôle de flux de script standard (pour / 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 perspicacité que vous obtenez lors de l'inspection de 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 connaît un outil comme ça? Aucun logiciel GUI clicky, s'il vous plaît, il doit fonctionner sur ssh, à partir d'autres scripts et ainsi de suite. "N'existe pas" est une réponse acceptable mais déprimante.
chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()
avez-vous regardé cela?perl
deunpack
(ᵔᴥᵔ)Réponses:
J'ai le même problème que vous depuis des années.
Pour des utilisations simples et non interactives, j'aime utiliser l'éditeur de blocs binaires BBE . BBE est au binaire comme SED au texte, y compris sa syntaxe archaïque et sa simplicité, cependant, il a beaucoup de fonctionnalités manquantes de ce dont j'ai souvent besoin, donc je dois le combiner avec d'autres outils. BBE n'est donc qu'une solution partielle. Notez également que BBE n'a eu aucune mise à jour ou amélioration depuis des années.
Bien sûr, on peut utiliser
xxd
avant etxxd -r
après la modification des données avec des outils basés sur du texte, 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 des blocs de périphériques.(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 les éditions binaires plus compliquées, je retombe généralement sur Python, même s'il est parfois trop lent pour les gros fichiers, ce qui est son principal inconvénient. J'espère Pyston (Python utilisant LLVM pour compiler en code machine optimisé) arrivera un jour à mûrir suffisamment 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 U * IX comme des systèmes encore.
MISE À JOUR
Il se trouve que j'utilise également l'assembleur plat homebrew, open source Intel x86 assembler , ou fasm pour faire court, qui est devenu bien plus qu'un simple assembleur.
Il possède un puissant préprocesseur de macro basé sur des blocs de texte (lui-même un langage complet) avec une syntaxe dans la tradition du langage de macro du borland turbo assembler, mais beaucoup plus avancé.
En outre, il dispose d'un langage de manipulation de données, qui permet d'inclure des fichiers arbitraires binaires, d'effectuer toutes sortes de manipulations binaires et arithmétiques sur celui-ci (entier 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 complet.
Il est beaucoup plus facile à utiliser que d'écrire un programme qui fait des manipulations binaires en C et probablement même en python. De plus, il se charge à une vitesse aveuglante, 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 le noyau Linux ABI).
Il a des bords de collerette, comme
ne prend pas en charge la simultanéité
étant en écriture dans un 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
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.
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 augmenter mais ne pas rétrécir jusqu'à ce que le fichier de sortie ait été écrit et que fasm soit terminé. Cela signifie que l'on ne peut générer des fichiers au maximum aussi volumineux que la mémoire principale restante dans une seule exécution de fasm.
les données ne peuvent être écrites que dans un seul fichier de sortie pour chaque série de fasm
oui, c'est un homebrew, vraiment très soigné et intelligent
la source
Vous n'avez pas nécessairement à "faire la paix" avec le déballage de Perl ... l'une des grandes choses à propos de perl est comment vous pouvez abuser de l'analyseur et de la table des symboles pour créer votre propre langue, dans un package personnalisé.
Est-ce essentiellement ce que vous recherchez?
L'exercice consiste alors à apprendre suffisamment de perl pour écrire le package MyBinLib. Demandez dans un forum Perl et les gens seront probablement ravis de vous aider.
la source
Avez-vous rencontré des
beav
macros mais je n'ai pas trouvé de script,apt-cache show beav
extrait :Ensuite, il y a
xxd
ce qui convertit en / du mode d'affichage binaire / ascii et pourrait être combiné avecsed
ouvi
, mais n'a pas la fonction d'échange d'octets.la source
Vous pouvez toujours aller chercher l'or et descendre dans C ou ASM. Si vous travaillez avec du binaire brut, faites-le rebondir directement sur le registre. Vous êtes «déjà là».
la source