Che lingua è quella di binario, come Perl è al testo?
-
13-09-2019 - |
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?
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:
- parsing binari con Erlang, lamer all'interno
- Più elaborazione dei file con Erlang
- formato Learning Erlang e Adobe Flash stessa tempo
- binario di grandi dimensioni I dati (non) è una debolezza di Erlang
- Programmazione efficiente con binari e stringhe di bit
- Erlang sintassi po 'e la rete di programmazione
- Erlang, il linguaggio per la programmazione di rete (1)
- Erlang, la lingua per rete di programmazione Problema 2: modello binario corrispondenza
- Un Erlang MIDI File Reader / Writer
- Erlang Bit Sintassi
- comprendere endianness
- Giocando con Erlang
- Erlang: Modello Dichiarazioni di corrispondenza vs caso Dichiarazioni / Altro
- una biblioteca flusso utilizzando Erlang binari
- binari a livello di bit e generalizzate Comprensioni in Erlang
- applicazioni, implementazione e valutazione delle prestazioni di programmazione flusso di bit in Erlang
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.