2009-06-14 3 views
16

Sto cercando un linguaggio di programmazione di script (o di livello superiore) (o, ad esempio, moduli per Python o linguaggi simili) per analizzare e manipolare senza sforzo dati binari nei file (ad esempio core dump), proprio come Perl consente di manipolare i file di testo in modo molto fluido.Che linguaggio è per binario, come Perl è quello di testo?

Le cose che voglio fare includono presentare blocchi arbitrari dei dati in varie forme (binario, decimale, esadecimale), convertire i dati da un endianess all'altro, ecc. Cioè, cose che normalmente usereste C o assembly per, ma sto cercando un linguaggio che permetta di scrivere minuscoli pezzi di codice per scopi molto specifici e una tantum molto rapidamente.

Qualche suggerimento?

+2

Interessante. Non ho mai visto niente di diverso da ASM che ti permette di gestire i dati binari in questo modo. Non è chiaro però che sarebbe utile, dato che i binari binari sono più o meno inutili senza interpretazione. Perché non limitarti alle operazioni C e bit a bit o a eseguire il cast binario in stringhe Perl? – guns

+0

Il cast binario delle stringhe è quello che uso oggi (in Python o Perl), ma ho la sensazione che ci debba essere un modo più fluido e più potente per farlo. Ho modificato la domanda per cercare di spiegare perché C non è la risposta, in questo caso. – ehdr

+1

Se si tratta in particolare dei core dump e della programmazione C, si potrebbe anche voler controllare GNU BFD: http://en.wikipedia.org/wiki/Binary_File_Descriptor_library – none

risposta

27

cose che voglio fare includere presentando pezzi arbitrarie dei dati in varie forme (binario, decimale, esadecimale), convertire i dati da un endianess ad un altro, ecc Questo è, cose che normalmente usereste C o di montaggio per, ma sto cercando un linguaggio che permetta di scrivere minuscoli pezzi di codice per scopi molto specifici e una tantum molto rapidamente.

Ebbene, mentre può sembrare intuitivo, ho trovato erlang estremamente ben adattato per questo, cioè per la sua potente supporto per pattern matching, anche per byte e bit (chiamati "Erlang Bit Syntax"). Che lo rende molto facile creare programmi, anche molto avanzate che si occupano di ispezionare e manipolare i dati su un byte-e anche su un po 'di livello:

Dal 2001, il linguaggio funzionale Erlang è dotato di un tipo di dati byte-oriented (chiamato binario) e con costrutti per fare la corrispondenza del modello su un binario.

E per citare informIT.com:

(Erlang) pattern matching davvero comincia a diventare divertente quando combinato con il tipo binario. Prendi in considerazione un'applicazione che riceva pacchetti da una rete e quindi li elabora . I quattro byte nel pacchetto possono essere un identificativo del tipo di pacchetto dell'ordine di byte . In Erlang, l'utente avrebbe solo bisogno di una singola funzione processPacket che potesse convertire questo in una struttura dati per l'elaborazione interna . Sembrerebbe una cosa come questo:

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

Così, Erlang con il suo supporto integrato per il pattern matching e, essendo un linguaggio funzionale è piuttosto espressiva, vedi ad esempio la realizzazione di ueencode in Erlang:

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

Per un'introduzione, vedere Bitlevel Binaries and Generalized Comprehensions in Erlang.Si consiglia inoltre di controllare alcune delle seguenti indicazioni:

+0

Esattamente quello che stavo per suggerire. Erlang può fare cose molto interessanti con i dati binari. – JesperE

+2

Anch'io vado con erlang su questa bella risposta –

+0

! estremamente completo. – ine

5

perl's pack e unpack?

+1

E regexps che funzionano felicemente con il binario - una funzione che ho aiutato a eseguire il debug nel corso della giornata attraverso il mio (ab) uso di esso. E puoi impacchettare/decomprimere in binario se vuoi abbinarli. Le implementazioni recenti con il loro supporto Unicode sembravano aver intorbidato l'acqua, ma penso che tutto ciò possa essere disattivato. –

2

Qualsiasi linguaggio di programmazione di alto livello con le funzioni pack/unpack. Tutti e 3 Perl, Python e Ruby possono farlo. È questione di preferenze personali. Ho scritto un po 'di analisi binaria in ognuno di questi e ho ritenuto che Ruby fosse il più semplice/elegante per questo compito.

2

Perché non utilizzare un interprete C? Li ho sempre usati per sperimentare frammenti, ma puoi usarne uno per scrivere qualcosa come descrivi senza troppi problemi.

Mi è sempre piaciuto EiC. Era morto, ma il progetto è risorto ultimamente. EiC è sorprendentemente capace e ragionevolmente veloce. C'è anche CINT. Entrambi possono essere compilati per piattaforme diverse, anche se penso che CINT abbia bisogno di Cygwin su Windows.

+0

Anche questo era il mio pensiero. Non conosco EiC, ma cint accetta un dialetto libero (lo fa in modo implicito (ma ancora forte) quando non si specificano i tipi per la variabile introdotta di recente), il che rende più stile RAD quando si scrivono macro. – dmckee

2

La libreria standard di Python ha alcune delle funzionalità richieste: il modulo array consente in particolare di leggere facilmente parti di file binari, endianness di swap, ecc .; il modulo struct consente un'interpretazione più dettagliata delle stringhe binarie. Tuttavia, nessuno dei due è altrettanto ricco di quanto richieda: ad esempio, per presentare gli stessi dati di byte o halfwords, è necessario copiarlo tra due array (l'add-on di terze parti numpy è molto più potente per interpretare la stessa area della memoria in molti modi diversi) e, ad esempio, per visualizzare alcuni byte in esadecimale, non c'è nulla di molto "in bundle" al di là di un semplice ciclo o comprensione di lista come [hex(b) for b in thebytes[start:stop]]. Ho il sospetto che ci siano moduli di terze parti riutilizzabili per facilitare ulteriormente tali compiti, ma non posso indicarvi uno ...

3

Sto usando 010 Editor per visualizzare i file binari tutto il tempo per visualizzare i file binari. È particolarmente adatto per lavorare con file binari.

Ha un linguaggio di script c-like facile da usare per analizzare file binari e presentarli in un modo molto leggibile (come un albero, campi codificati per colore, cose del genere) .. Ci sono alcuni script di esempio per analizzare file zip e file bmp.

Ogni volta che creo un formato di file binario, faccio sempre un piccolo script per l'editor 010 per visualizzare i file. Se hai alcuni file di intestazione con alcune strutture, fare un lettore per i file binari è questione di minuti.

0

Se si sta eseguendo l'elaborazione a livello binario, è molto basso e probabilmente deve essere molto efficiente e avere requisiti minimi di dipendenza/installazione.

Quindi mi piacerebbe andare con C - gestisce bene i byte - e puoi probabilmente google per alcuni pacchetti di librerie che gestiscono i byte.

Andare con qualcosa come Erlang introduce inefficienze, dipendenze e altri bagagli che probabilmente non si desiderano con una libreria di basso livello.

+0

In realtà, la velocità non è un grosso problema per me, poiché la userò principalmente per "sfogliare" alcuni binari blob (ad esempio un core dump o dati registrati da uno stream) più o meno interattivamente, con una dimensione che di solito può essere contata in megabyte. Non si sa di pacchetti di librerie di questo tipo per C che vale la pena di verificare? – ehdr

1

Forth può anche essere abbastanza buono in questo, ma è un po 'arcano.

+2

A * bit * arcano? :) –

1

Beh, se la velocità non è una considerazione, e si desidera perl, quindi tradurre ogni riga di binario in una linea di caratteri - 0 di e 1's. Sì, so che non ci sono linefeed in binario :) ma presumibilmente hai alcune dimensioni fisse - ad es. per byte o qualche altra unità, con la quale è possibile suddividere il blob binario.

poi basta usare l'elaborazione delle stringhe perl su tali dati :)

4

Il modulo di Python bitstring è stato scritto per questo scopo. Ti permette di prendere fette arbitrarie di dati binari e offre una serie di diverse interpretazioni attraverso le proprietà di Python. Fornisce anche molti strumenti per la costruzione e la modifica dei dati binari.

Ad esempio:

>>> 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 

Ci sono anche funzioni per la lettura a bit e la navigazione nel bitstring, proprio come nei file; in realtà questo può essere fatto direttamente da un file senza la lettura in memoria:

>>> 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 

ci sono anche opinioni con diverse endianness così come la possibilità di scambiare endianness e molto altro ancora - dare un'occhiata al manual.

Problemi correlati