GNU/Linux >> Linux Esercitazione >  >> Linux

Un ambiente simile a una shell per l'elaborazione binaria?

Questa domanda mi è venuta un paio di volte prima, ora in risposta alla domanda
Esegui il ciclo di blocchi di dati binari da stdin in Bash
Risposte fornite in https://stackoverflow.com/questions/993434/what Anche -language-is-to-binary-as-perl-is-to-text non erano soddisfacenti.

Sto cercando un ambiente di scripting adatto specificamente per gestire I/O con file binari. So di poter usare uno dei linguaggi di programmazione a tutti gli effetti (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 del fatto che sono meno adatti per lo scripting (chiamando altre applicazioni da esso). Perl non è migliore con il suo unpack funzioni, operazioni orientate alle stringhe e sintassi sciocca.

Qualcosa come od , ma come lingua.

Cosa mi aspetto:

  1. imposta o modifica l'endianità con un solo interruttore/comando.
  2. semplice specifica del tipo richiesto (qualcosa come l'estensione di bash read var con int32 var , float var ecc.).
  3. Gestione del binario tramite pipe, salto del numero specificato di byte.
  4. controllo del flusso di scripting standard (per/se/…) a cui siamo abituati.

Vorrei elaborare i dati grezzi (fotografia, dati scientifici, formati sconosciuti e scarsamente documentati) con la stessa facilità e intuizione che si ottengono quando si ispezionano i file ASCII. Sto usando c ora, ma non è ottimale per lo scripting ad hoc e non può essere interattivo.

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

Risposta accettata:

Anche io ho il tuo stesso identico problema da anni.

Per usi semplici non interattivi, mi piace usare l'editor di blocchi binari BBE.
BBE sta in binario come SED sta in testo, inclusa la sua sintassi arcaica e semplicità, tuttavia, ha molte funzionalità mancanti da quello che ho spesso necessario, quindi devo combinarlo con altri strumenti. Quindi, BBE è solo una soluzione parziale.
Tieni inoltre presente che BBE non ha avuto aggiornamenti o miglioramenti per anni.

Ovviamente si può usare xxd prima e xxd -r dopo aver modificato i dati con strumenti basati su testo, ma ciò non funzionerà quando i dati in questione sono di grandi dimensioni ed è richiesto un accesso casuale, ad esempio durante l'elaborazione di dispositivi a blocchi.

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

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

Correlati:Processo discendenti?

AGGIORNAMENTO

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

Ha un potente preprocessore macro basato su blocchi di testo (a sua volta un linguaggio completo) con una sintassi nella tradizione del linguaggio macro borland turbo assembler, ma molto più avanzato.

Inoltre, ha un linguaggio di manipolazione dei dati, che consente di includere file binari in modo arbitrario, eseguire tutti i tipi di manipolazione binaria e aritmetica su di esso (solo numeri interi) al "tempo di compilazione" e scrivere il risultato in un file di output. Questo linguaggio di manipolazione dei dati ha strutture di controllo ed è anche completo.

È molto più facile da usare che scrivere un programma che esegua qualche manipolazione binaria in C e probabilmente anche in Python. Inoltre, si carica incredibilmente velocemente, poiché è un eseguibile di piccole dimensioni quasi senza dipendenze esterne (ci sono 2 versioni:o richiede solo libc o può essere eseguito come eseguibile statico direttamente sull'ABI del kernel Linux).

Ha dei bordi a balze, come

  1. non supporta la concorrenza

  2. scrivendo in assembly x86 a 32 bit (funziona su x86_64), probabilmente avrai 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 del preprocessore di macro è completo, questo significa che è meglio avere una certa 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 "piatto" in memoria e questo buffer può aumentare ma non ridursi fino a quando il file di output non è stato scritto e fasm terminato. Ciò significa che è possibile generare solo file di dimensioni al massimo pari alla memoria principale rimasta in una singola esecuzione di fasm.

  5. i dati possono essere scritti solo in un singolo file di output per ogni esecuzione di fasm

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


Linux
  1. MySQL:conversione in dati per tabella per InnoDB

  2. Linux:variabile d'ambiente permanente per tutti gli utenti?

  3. Pseudo file per dati temporanei?

  4. Strumento per modificare la sezione dinamica di un binario ELF

  5. Converti i dati binari in esadecimali in uno script di shell

Dove dovrebbero essere impostate le variabili d'ambiente per Jenkins?

Che cos'è un database distribuito e a cosa servono i sistemi di dati distribuiti?

Come installare Anaconda su Linux per la scienza dei dati vince!

I 20 migliori software di data mining per desktop Linux

I 10 migliori widget KDE Plasma per l'ambiente desktop KDE

15 migliori gestori di compressione o archivio per il sistema Linux