Question

Je cherche un script (ou la programmation de niveau supérieur) langue (ou modules, par exemple pour les langages Python ou similaires) pour l'analyse et la manipulation sans effort les données binaires dans des fichiers (par exemple des coredumps), comme en Perl permet la manipulation de fichiers texte très facilement .

Ce que je veux faire inclure la présentation des parties arbitraires des données sous diverses formes (binaire, décimal, hexadécimal), convertir les données d'un endianess à un autre, etc. C'est, les choses que vous utilisez normalement C ou de montage pour, mais Je suis à la recherche d'un langage qui permet d'écrire de petits morceaux de code à des fins, un temps très spécifiques très rapidement.

Toutes les suggestions?

Était-ce utile?

La solution

  

Ce que je veux faire inclure la présentation des parties arbitraires des données sous diverses formes (binaire, décimal, hexadécimal), convertir les données d'un endianess à un autre, etc. C'est, les choses que vous utilisez normalement C ou de montage pour, mais Je suis à la recherche d'un langage qui permet d'écrire de petits morceaux de code à des fins, un temps très spécifiques très rapidement.

Eh bien, alors qu'il peut sembler contre-intuitif, j'ai trouvé Erlang très bien adapté pour cela, notamment en raison à son support puissant pour , même pour les octets et bits (appelé « Erlang Bit Syntaxe "). Ce qui le rend très facile à créer même des programmes très avancés qui traitent de l'inspection et la manipulation de données sur un même et byte un niveau binaire:

  

Depuis 2001, la langue fonctionnelle Erlang est livré avec un type de données octet par octet (appelé binaire) et avec des constructions à faire sur un modèle correspondant binaire.

Et de citer informIT.com :

  

(Erlang) Correspondance de modèle commence vraiment obtenir   amusant lorsqu'il est combiné avec le binaire   type. Considérons une application   reçoit des paquets à partir d'un réseau et   puis les processus. Les quatre octets   un paquet peut être un ordre d'octet réseau   Identificateur de type de paquet. En Erlang, vous   aurait juste besoin d'un seul ProcessPacket   fonction qui pourrait convertir en   une structure de données interne pour   En traitement. Il ressemblerait à quelque chose   comme ceci:

processPacket(<<1:32/big,RestOfPacket>>) ->
    % Process type one packets
    ...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
    % Process type two packets
    ...

Alors, Erlang avec son support intégré pour le filtrage et étant un langage fonctionnel est assez expressif, voir par exemple la mise en œuvre de ueencode en Erlang:

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.

Pour une introduction, voir Bitlevel et Binaires compréhensions Généralisées Erlang. vous pouvez également consulter certains des pointeurs suivants:

Autres conseils

perl pack rel="noreferrer"> de et Déballez ?

Le module Python bitstring a été écrit à cet effet. Il vous permet de prendre des tranches de données binaires arbitraires et offre un certain nombre d'interprétations différentes par les propriétés Python. Il donne aussi beaucoup d'outils pour la construction et la modification des données binaires.

Par exemple:

>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf')                           # 16 bits long
>>> print(s.hex, s.bin, s.int)                       # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001'                           # slice assignment
>>> s.replace('0b110', '0x345')                      # find and replace
2                                                    # 2 replacements made
>>> s.prepend([1])                                   # Add 1 bit to the start
>>> s.byteswap()                                     # Byte reversal
>>> ordinary_string = s.bytes                        # Back to Python string

Il fonctionne également pour la lecture bit à bit et la navigation dans la chaîne binaire, un peu comme dans les dossiers; en fait, cela peut être fait directement à partir d'un fichier sans le lire dans la mémoire:

>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001')         # Seek to next occurence, if found
True

Il y a des vues aussi avec différentes endiannesses ainsi que la possibilité d'échanger boutisme et beaucoup plus - jetez un oeil à la page

Jetez un oeil à python bitstring, il semble comme exactement ce que vous voulez:)

J'utilise 010 Editor pour afficher les fichiers binaires tout le temps pour afficher les fichiers binaires. Il est particulièrement adapté pour travailler avec des fichiers binaires.

Il a un facile d'utiliser un langage de script c-like pour analyser les fichiers binaires et les présenter d'une manière très lisible (comme un arbre, les champs codés par couleur, des trucs comme ça) .. Il y a quelques exemples de scripts pour analyser zipfiles et bmpfiles.

Chaque fois que je crée un format de fichier binaire, je fais toujours un petit script pour 010 éditeur pour afficher les fichiers. Si vous avez des fichiers d'en-tête avec des struct, ce qui rend un lecteur pour les fichiers binaires est une question de minutes.

Tout langage de programmation de haut niveau avec le pack / fonctions Déballez fera. Tous les 3 Perl, Python et Ruby peuvent le faire. Il est question de préférence personnelle. J'ai écrit un peu d'analyse syntaxique binaire dans chacun d'entre eux et a estimé que Ruby était plus facile / la plus élégante pour cette tâche.

Pourquoi ne pas utiliser un interpréteur C? Je les ai toujours l'habitude d'expérimenter avec des extraits, mais vous pouvez utiliser l'un à l'écriture quelque chose comme vous décrivez sans trop de difficultés.

Je l'ai toujours aimé EeC . Il était mort, mais le projet a été ressuscitée ces derniers temps. EeC est étonnamment capable et assez rapide. Il y a aussi CINT . Les deux peuvent être réunies pour différentes plates-formes, bien que je pense a besoin CINT Cygwin sur Windows.

bibliothèque standard de Python partie de ce que vous avez besoin - le module de tableau dans particulier vous permet de lire facilement des parties de fichiers binaires, boutisme d'échange, etc; le module struct permet une interprétation plus fine des chaînes binaires. Cependant, ni est tout aussi riche que vous avez besoin: par exemple, de présenter les mêmes données que octets ou demi-mots, vous devez le copier entre deux tableaux ( numpy tiers add-on est beaucoup plus puissant pour interpréter la même zone de mémoire de plusieurs façons différentes), et, par exemple, pour afficher quelques octets en hexadécimal il n'y a pas grand-chose " livré » au-delà d'une simple boucle ou la compréhension liste tels que [hex(b) for b in thebytes[start:stop]]. Je soupçonne qu'il ya des modules réutilisables tiers pour faciliter ces tâches encore plus loin, mais je ne peux pas vous indiquer un ...

Forth peut aussi être assez bon, mais il est un peu Arcane.

Eh bien, si la vitesse est pas une considération, et que vous voulez perl, puis traduire chaque ligne de binaire en une ligne de caractères - 0 et de 1. Oui, je sais qu'il n'y a pas linefeeds en binaire :) mais sans doute vous avez une taille fixe - par exemple par octet ou une autre unité, avec laquelle vous pouvez briser le blob binaire.

Ensuite, il suffit d'utiliser le traitement de la chaîne de perl sur ces données:)

Si vous faites le traitement de niveau binaire, il est très faible et les besoins susceptibles d'être très efficace et avoir des dépendances minimales / Précautions d'installation.

Je voudrais aller avec C - poignées octets bien -. Et vous pouvez probablement Google pour certains paquets de bibliothèques qui gèrent octets

Voulez-vous profiter quelque chose comme Erlang introduit l'inefficacité, les dépendances et autres bagages que vous ne voulez probablement pas avec une bibliothèque de bas niveau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top