2011-08-16 6 views
6

Tengo un flujo binario en la entrada estándar, está en un formato de tamaño fijo, un flujo continuo de paquetes, cada paquete tiene un encabezado con longitud X y un cuerpo con longitud Y.cadena de herramientas bash/unix procesamiento/división de flujo binario

Así que si X = 2 y = 6, entonces es algo así como 00abcdef01ghijkl02mnopqr03stuvwx, pero es binaria y tanto la cabecera y los datos puede contener cualquier "caracteres" (incluyendo '\ 0' y nueva línea), el ejemplo es sólo para facilitar la lectura .

Quiero deshacerme de los datos del encabezado para que la salida se vea así: abcdefghijklmnopqrstuvwx.

¿Hay algún comando en la cadena de herramientas de Unix que me permita hacer esto? Y, en general, ¿hay alguna herramienta para manejar datos binarios? La única herramienta que pude pensar es od/hexdump, pero ¿cómo se convierte el resultado a binario?

+0

Son estos paquetes de red? ¿Qué hay de tcpdump? – AlG

Respuesta

3

Use xxd que va hacia y desde un hexdump.

xxd -c 123 -ps 

dará salida a su flujo de 123 bytes por línea. Para invertir el uso

xxd -r -p 

Ahora debería ser capaz de poner esto junto con cut a caer caracteres ya que se puede hacer algo como

cut -c 3- 

para obtener todos los caracteres del 3 al final de una línea. No olvides usar una cantidad de caracteres igual a 2X para dar cuenta de dos caracteres hexadecimales por byte.

Así que algo en la línea de

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

donde X+Y y 2X+1 se sustituyen con los valores numéricos reales. Tendrá que poner su flujo de datos en algún lugar apropiado en el comando anterior.

+0

por lo que la idea estaba bien .. 'xxd', nunca escuché al respecto. ¡Gracias! nota: el corte es de '2X + 1'. –

1

Perl es una herramienta bastante común de Unix. Tírela a perl. Si su byte de longitud fija está alineado, una operación substr simple debería funcionar. Aquí hay una muestra perl que debería funcionar.

#!/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

Quiere 'my $ len = 8' leer 8 bytes a la vez. –

+0

Es cierto, pero al menos es configurable;) – bot403

0

También hay bbe - binary block editor, que es una especie de sed binaria para el manejo de datos binarios la forma en Unix.

http://bbe-.sourceforge.net

1

Como una sola línea, me gustaría escribir:

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

ejemplo:

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

come los nuevos renglones 'echo -e" \ n00abcdef01 .. "'. ¿alguna idea? –

+0

@yi_H, sí, vaya con la respuesta ["sysread"] de bot403 (http://stackoverflow.com/questions/7080887/bash-unix-toolchain-binary-stream-processing-slicing/7081227#7081227). –

0

El editor de secuencia binaria es una herramienta escrita en java para manejar flujos Se puede usar desde Java y desde la línea de comandos. https://sourceforge.net/projects/bistreameditor/

DESCARGO de responsabilidad: soy el autor de esta herramienta.

A diferencia de las herramientas basadas en línea nueva como sed, permite el recorrido personalizado y el almacenamiento de datos a través del recorrido y el búfer. Los datos binarios se pueden tratar como caracteres de un byte y operaciones/coincidencias de cadenas permitidas. Puede escribir en múltiples salidas y usar diferentes codificaciones. Debido a esta flexibilidad, actualmente la línea de comando tiene muchos parámetros, que deben simplificarse.

Se debe descargar y usar el archivo bse.zip. Para el ejemplo anterior, que simplemente tendría que hacer un substr (2) en la entrada de la len 8. La línea de comandos completa es

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 
Cuestiones relacionadas