Un ambiente simile a una shell per l'elaborazione binaria


15

Questa domanda mi è venuta un paio di volte prima, ora in risposta alla domanda Passa attraverso blocchi di dati binari da stdin in Bash Answers in /programming/993434/what-language-is-to-binary -as-perl-is-to-text non erano soddisfacenti.

Sto cercando un ambiente di scripting adatto in modo specifico alla gestione dell'I / O con file binari. So di poter usare uno dei linguaggi di programmazione completi (c / Python / ...) ma hanno un enorme sovraccarico di inizializzazione e codifica (allocazione e fread / fwrite in c, stringhe di bit in Python ...) per non parlare sono meno adatti per gli script (richiamando altre applicazioni da esso). Perl non è migliore con le sue unpackfunzioni, il funzionamento orientato alle stringhe e la sintassi sciocca.

Qualcosa del genere od, ma come lingua.

Cosa mi aspetto:

  1. impostare o modificare l'endianness con un singolo switch / comando.
  2. semplice specifica del tipo richiesto (qualcosa come estendere bash read varcon int32 var, float varecc.).
  3. gestione di binari attraverso pipe, saltando il numero specificato di byte.
  4. controllo standard del flusso di script (per / if / ...) a cui siamo abituati.

Vorrei elaborare i dati grezzi (fotografia, dati scientifici, formati sconosciuti e scarsamente documentati) con la stessa facilità e comprensione che si ottengono durante l'ispezione dei file ASCII. Sto usando cora, ma non è ottimale per gli script ad hoc e non può essere interattivo.

Qualcuno conosce uno strumento del genere? Nessun software con interfaccia grafica cliccabile, per favore, deve funzionare su ssh, da altri script e così via. "Non esiste" è una risposta accettabile, ma deprimente.


2
Non toglie il dolore dei tempi di avvio, ma trovo che i byte di Python 3.3, insieme al plumbum, siano molto funzionali: l' chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()hai visto?
Anthon,

Potresti prendere il codice C che hai ora e trasformarlo in un set di strumenti da riga di comando che potresti usare in uno script bash. Sebbene non sia possibile inserire il binario in una variabile shell, è possibile riporlo in pipe denominate ('fifo'); il loro contenuto è tenuto in memoria fino a quando non si desidera leggerli.
Riccioli d'oro

1
C'è un grave difetto nel tuo ragionamento in pitone e perl, BTW. Mentre i singoli strumenti della riga di comando vengono compilati, gli script della shell non lo sono e implicano molto fork (se si desidera costosi, il fork è). La tua discussione, altra domanda, ecc., Implica che andresti bene usando bash qui se fosse in grado di gestire i binari. Gli script Python e perl sono entrambi precompilati. Se esegui il benchmark di uno script python o perl ragionevolmente complesso rispetto a uno script bash parallelo, il perl o il python sarà un ordine di grandezza più veloce . Se non mi credi, sei il benvenuto a cercare nel web prove del contrario.
Riccioli d'oro

Non sto cercando uno strumento che corre veloce, sto cercando qualcosa che posso programmare velocemente. Ad esempio, se ho uno strano programma che genera un int binario per le dimensioni dell'array delle strutture (int, float, float) che seguono dopo, vorrei leggere rapidamente le dimensioni dell'array e passare in rassegna l'array, possibilmente calcolandone alcuni cumulativo o massimo di alcuni componenti o semplicemente stampare un componente come colonna ASCII per l'elaborazione di gnuplot. Anthon: grazie, non lo sapevo, sarà utile. riccioli d'oro: sto cercando di evitarlo, ma alla fine potrei scrivere il mio strumento :)
orion,

2
Sembra che tu abbia bisogno di un tutorial su come usare perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

Risposte:


2

Ho lo stesso identico problema di te da anni.

Per semplici usi non interattivi, mi piace usare l'editor di blocchi binari BBE . BBE sta al binario come SED al testo, compresa la sua sintassi arcaica e semplicità, tuttavia, ha molte caratteristiche mancanti da ciò di cui ho spesso bisogno, quindi devo combinarlo con altri strumenti. Quindi, BBE è solo una soluzione parziale. Si noti inoltre che BBE non ha avuto aggiornamenti o miglioramenti per anni.

Naturalmente è possibile utilizzare xxdprima e xxd -rdopo la modifica dei dati con strumenti basati su testo, ma ciò non funzionerà quando i dati in questione sono di grandi dimensioni e è richiesto un accesso casuale, ad esempio durante l'elaborazione di dispositivi a blocchi.

(Nota: per Windows esiste almeno il linguaggio di scripting WinHex costoso e proprietario, ma non ci porterà da nessuna parte.)

Per un editing binario più complicato, di solito ricado anche su Python, anche se a volte è troppo lento per file di grandi dimensioni, che è il principale svantaggio. Spero che Pyston (Python che impiega LLVM per compilare in codice macchina ottimizzato) un giorno diventerà abbastanza maturo per essere utilizzabile, o ancora meglio, qualcuno progetterà e implementerà un linguaggio di scripting di elaborazione binaria compatto, veloce e versatile gratuito, per il quale AFAIK non esiste U * IX gradisce ancora i sistemi.

AGGIORNARE

Mi capita anche di usare l'assemblatore flat home assembler Intel x86 open source o il fasm in breve, che si è evoluto in molto più di un semplice assemblatore.

Ha un potente preprocessore macro basato su blocco di testo (a sua volta un linguaggio completo turing) con una sintassi nella tradizione del linguaggio macro dell'assemblatore turbo borlandico, ma molto più avanzato.

Inoltre, ha un linguaggio di manipolazione dei dati, che consente di includere binari file arbitrari, eseguire tutti i tipi di manipolazione binaria e aritmetica (solo intero) in "fase di compilazione" e scrivere il risultato in un file di output. Questo linguaggio di manipolazione dei dati ha strutture di controllo ed è anche in fase di completamento.

È molto più facile da usare rispetto alla scrittura di un programma che esegue alcune manipolazioni binarie in C e probabilmente anche in Python. Inoltre, si carica in modo accecante, poiché è un eseguibile di piccole dimensioni con quasi nessuna dipendenza esterna (ci sono 2 versioni: o richiede solo libc o può essere eseguito come eseguibile statico direttamente sull'ABI del kernel di Linux).

Ha alcuni bordi ruff, come

  1. non supporta la concorrenza

  2. in fase di scrittura in assembly x86 a 32 bit (funziona su x86_64), probabilmente hai bisogno di qemu o di un emulatore simile se vuoi eseguirlo su qualcosa di diverso da x86 o x86_64

  3. il suo potente linguaggio di preprocessore è in fase di completamento, ciò significa che è meglio avere qualche esperienza con linguaggi come Lisp, Haskell, XSLT o probabilmente M4 sarebbe la scelta migliore.

  4. tutti i dati che devono essere scritti nel file di output vengono eseguiti in un buffer "flat" in memoria e questo buffer può crescere ma non ridursi fino a quando il file di output non è stato scritto e il fasm è stato terminato. Ciò significa che si possono generare file al massimo delle dimensioni della memoria principale rimasta in una sola corsa di fasm.

  5. i dati possono essere scritti in un unico file di output per ogni serie di fasm

  6. sì, è homebrew, comunque molto pulito e intelligente


2

Non è necessario "fare la pace" con il disimballaggio di Perl ... una delle grandi cose di perl è come puoi abusare del parser e della tabella dei simboli per creare la tua lingua, in un pacchetto personalizzato.

È fondamentalmente quello che stai cercando?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

L'esercizio quindi è imparare abbastanza perl per scrivere il pacchetto MyBinLib. Chiedi in un forum Perl e le persone sarebbero probabilmente felici di aiutarti.


1

Ti sei beavmai imbattuto in macro ma non sono riuscito a trovare gli script,

apt-cache show beav estratto :

Con beav, puoi modificare un file in esadecimale, ASCII, EBCDIC, OTTALE, DECIMALE e BINARIO. È possibile visualizzare ma non modificare i dati in modalità FLOAT. Puoi cercare o cercare e sostituire in una di queste modalità. I dati possono essere visualizzati nei formati BYTE, WORD o DOUBLE WORD. Durante la visualizzazione di WORDS o DOUBLE WORDS i dati possono essere visualizzati nell'ordine di byte di INTEL o MOTOROLA. I dati di qualsiasi lunghezza possono essere inseriti in qualsiasi punto del file. La fonte di questi dati può essere la tastiera, un altro buffer o un file. Tutti i dati visualizzati possono essere inviati a una stampante nel formato visualizzato. I file più grandi della memoria possono essere gestiti.

Quindi c'è quello xxdche converte in / dalla modalità di visualizzazione binaria / ascii e potrebbe essere combinato con sedo vi, ma non ha la funzione di scambio di byte.


0

Potresti sempre andare per l'oro e scendere in C o ASM. Se stai lavorando con binari grezzi, rimbalza subito dal registro. Sei "già lì".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.