2011-08-16 2 views
6

Ho un flusso binario su input standard, è in un formato dimensione fisso, un flusso continuo di pacchetti, ogni pacchetto ha un'intestazione con lunghezza X e un corpo con lunghezza Y.bash/unix toolchain elaborazione/affettamento del flusso binario

quindi, se X = 2 Y = 6, allora è qualcosa di simile 00abcdef01ghijkl02mnopqr03stuvwx, ma è binario e sia l'intestazione e di dati può contenere eventuali "caratteri" (tra cui '\ 0' e ritorno a capo), l'esempio è solo per migliorare la leggibilità .

Desidero eliminare i dati di intestazione in modo che l'output sia simile al seguente: abcdefghijklmnopqrstuvwx.

Ci sono comandi nella toolchain unix che mi consentono di farlo? E in generale ci sono strumenti per gestire i dati binari? L'unico strumento che potrei pensare è od/hexdump ma come si converte il risultato in binario?

+0

sono questi pacchetti di rete? Che ne pensi di tcpdump? – AlG

risposta

3

Utilizzare xxd che va ae da un dump esadecimale.

xxd -c 123 -ps 

emetterà il flusso con 123 byte per riga. Per invertire l'uso

xxd -r -p 

Si dovrebbe ora essere in grado di mettere questo insieme cut a cadere caratteri perché si può fare qualcosa di simile

cut -c 3- 

per ottenere tutti i caratteri dalla 3 alla fine di una riga. Non dimenticare di utilizzare un numero di caratteri uguale a 2X per tenere conto di due caratteri esadecimali per byte.

Quindi, qualcosa sulla falsariga di

xxd -c X+Y -ps | cut -c 2X+1- | xxd -r -p 

dove X+Y e 2X+1 vengono sostituiti con valori numerici effettivi. Dovrai mettere il tuo flusso di dati da qualche parte appropriato al comando precedente.

+0

quindi l'idea era ok .. 'xxd', non ne ho mai sentito parlare. Grazie! nota: il taglio è da '2X + 1'. –

1

Perl è uno strumento unix piuttosto standard. Conducilo su perl. Se il suo byte di lunghezza fissa allineato, dovrebbe funzionare una semplice operazione di substr. Ecco un esempio perl che dovrebbe funzionare.

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $buf; 
my $len = 8; 
my $off = 2; 
while(sysread(STDIN,$buf,$len) != 0){ 
    print substr($buf,$off); 
} 

exit 0; 

+0

Vuoi 'my $ len = 8' per leggere 8 byte alla volta. –

+0

Vero, ma almeno è configurabile;) – bot403

0

C'è anche bbe - binary block editor, che è una specie di binario sed per la gestione di dati binari il modo Unix.

http://bbe-.sourceforge.net

1

come un one-liner, mi piacerebbe scrivere:

perl -00 -ne 'chomp; while (/(?:..)(......)/sg) {print $1}' 

esempio:

echo '00abcdef01ghijkl02mnopqr03stuvw 
00abcdef01ghi 
kl02mnopqr' | perl -00 -ne 'chomp; while (/(?:..)(......)/sg) {print $1}' | od -c 

produce

0000000 a b c d e f g h i j k l m n o p 
0000020 q r s t u v w \n a b c d e f g h 
0000040 i \n k l m n o p q r 
0000052 
+0

mangia le nuove righe 'echo -e" \ n00abcdef01 .. "'. qualche idea? –

+0

@yi_H, sì, vai con la risposta ["sysread" di bot403 (http://stackoverflow.com/questions/7080887/bash-unix-toolchain-binary-stream-processing-slicing/7081227#7081227). –

0

L'editor di flusso binario è un strumento scritto in java per la gestione dei flussi. Può essere usato sia da java che da linea di comando. https://sourceforge.net/projects/bistreameditor/

DISCLAIMER: sono l'autore di questo strumento.

A differenza degli strumenti basati su nuova riga come sed, consente il traversamento personalizzato e la memorizzazione dei dati tramite traversal e buffer. I dati binari possono essere trattati come caratteri di un byte e operazioni/corrispondenze di stringhe consentite. Può scrivere su più uscite e utilizzare diverse codifiche. A causa di questa flessibilità, attualmente la riga di comando ha molti parametri, che devono essere semplificati.

Il file bse.zip deve essere scaricato e utilizzato. Per l'esempio precedente, si avrebbe semplicemente bisogno di fare un substr (2) sull'ingresso di len 8. La linea di comando completo è

java -classpath "./bin:$CMN_LIB_PATH/commons-logging-1.1.1.jar:$CMN_LIB_PATH/commons-io-2.1.jar:$CMN_LIB_PATH/commons-jexl-2.1.1.jar:$CMN_LIB_PATH/commons-lang3-3.1.jar" 
-Dinputsrc=file:/fullpathtofile|URL|System.in 
-Dtraverser=org.milunsagle.io.streameditor.FixedLengthTraverser 
-Dtraversercons=size -Dtraverserconsarg0=8 
-Dbuffer=org.milunsagle.io.streameditor.CircularBuffer 
-Dbuffercons=size -Dbufferconsarg0=8 
-Dcommands='PRN V $$__INPUT.substring(2)' 
org.milunsagle.io.streameditor.BinaryStreamEditorInvoker