Domanda

Sto cercando uno scripting (o programmazione di livello superiore) lingua (o moduli ad esempio per Python o linguaggi simili) per l'analisi senza sforzo e la manipolazione di dati binari nei file (ad esempio core dump), molto simile a Perl permette la manipolazione di file di testo molto agevolmente .

Le 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 montaggio per, ma sto cercando un linguaggio che permette di scrivere piccoli pezzi di codice per finalità di una volta altamente specifiche molto rapidamente.

Qualche suggerimento?

È stato utile?

Soluzione

  

Le 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 montaggio per, ma sto cercando un linguaggio che permette di scrivere piccoli pezzi di codice per finalità di una volta altamente specifiche molto rapidamente.

Bene, anche se può sembrare contro-intuitivo, ho trovato Erlang molto ben adatto per questo, vale a dire a causa al suo potente sostegno corrispondenza , anche per byte e bit (chiamati " Erlang Bit Sintassi "). 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 livello di bit:

  

A partire dal 2001, il linguaggio funzionale Erlang è dotato di un tipo di dati byte-oriented (chiamato binario) e con costrutti per fare pattern matching su un binario.

E per citare informIT.com :

  

(Erlang) Pattern matching inizia davvero a ottenere   divertente quando combinato con il binario   genere. Considerate un'applicazione che   riceve i pacchetti da una rete e   poi li elabora. I quattro byte   un pacchetto può essere un byte-ordine di rete   pacchetto tipo identificatore. In Erlang, è   avrebbe solo bisogno di un singolo ProcessPacket   funzione che potrebbe convertire questo in   una struttura di dati per interno   in lavorazione. Sembrerebbe qualcosa   in questo modo:

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

Quindi, Erlang con il suo supporto integrato per il pattern matching e, essendo un linguaggio funzionale è piuttosto espressiva, si veda 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 Binari e generalizzata Comprensioni in Erlang . si consiglia inoltre di controllare alcune delle seguenti indicazioni:

Altri suggerimenti

Il Python bitstring modulo è stato scritto per questo scopo. Esso consente di scattare fette arbitrari di dati binari e offre una serie di diverse interpretazioni attraverso le proprietà Python. Si dà anche un sacco di 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 funzioni anche 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 viste anche con diversi endianness così come la possibilità di scambiare endianness e molto altro ancora - dare un'occhiata al manuale .

Date un'occhiata a pitone bitstring , sembra esattamente quello che vuoi:)

010 Editor per visualizzare i file binari per tutto il tempo per visualizzare i file binari. E 'particolarmente orientata per lavorare con i file binari.

E 'un facile da usare c-come linguaggio di scripting per analizzare i file binari e di presentarle 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 bmpfiles.

Ogni volta che creo un formato di file binario, ho sempre fare un piccolo script per 010 editor per visualizzare i file. Se hai qualche file header con alcuni le strutture, rendendo un lettore per i file binari è una questione di minuti.

Ogni linguaggio di programmazione ad alto livello con pacchetto funzioni / decomprimere farà. Tutti 3 Perl, Python e Ruby in grado di farlo. E 'questione di preferenze personali. Ho scritto un po 'di analisi binaria in ciascuno di questi e sentivo che Ruby era più facile / più elegante per questo compito.

Perché non usare un interprete C? Li ho sempre usato per sperimentare con frammenti, ma si potrebbe usare uno script qualcosa come lei descrive senza troppi problemi.

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

libreria standard di Python ha alcune delle cose che si richiede - il modulo serie particolare consente di leggere facilmente le parti del file binari, endianness di swap, ecc; struct modulo consente per l'interpretazione più dettagliato di stringhe binarie. Tuttavia, nessuno dei due è altrettanto ricco come desiderato: per esempio, per presentare gli stessi dati come byte o halfword, è necessario copiare tra due matrici ( NumPy di terze parti add-on è molto più potente per interpretare la stessa area di memoria in molti modi diversi), e, per esempio, per visualizzare alcuni byte in formato esadecimale non c'è molto " bundle" al di là di un semplice loop o di lista, come [hex(b) for b in thebytes[start:stop]]. Ho il sospetto che ci sono moduli riutilizzabili di terze parti per facilitare ulteriormente tali compiti, ma non posso puntare a uno ...

Forth può anche essere abbastanza bravo a questo, ma è un po 'arcano.

Bene, se la velocità non è una considerazione, e si desidera perl, quindi tradurre ogni riga di binario in una linea di caratteri - 0 e 1.. Sì, lo so non ci sono ritorni a capo in binario :) ma presumibilmente hai qualche dimensione fissa - per esempio per byte o qualche altra unità, con cui è possibile spezzare il blob binario.

Poi basta utilizzare l'elaborazione delle stringhe perl su tali dati:)

Se stai facendo l'elaborazione livello binario, è molto basso livello e probabilmente ha bisogno di essere molto efficiente e hanno dipendenze minime / install requisiti.

Quindi, vorrei andare con C - maniglie byte bene -. E, probabilmente, si può google per alcuni pacchetti di libreria che gestiscono byte

Vuoi utilizzare qualcosa come Erlang presenta inefficienze, le dipendenze, e altri bagagli che probabilmente non si vuole con una libreria di basso livello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top