2011-08-16 14 views
6

Mam strumień binarny na standardowym wejściu, ma on stały format, ciągły strumień pakietów, każdy pakiet ma nagłówek o długości X i bryłę o długości Y.bash/procesor binarny/binarny strumień toolchain binarny

Więc jeśli X = 2 y = 6, to jest to coś 00abcdef01ghijkl02mnopqr03stuvwx, ale to binarny i zarówno nagłówek i dane mogą zawierać żadnych „znaków” (w tym „\ 0” i znak nowej linii), przykładem jest właśnie dla czytelności .

Chcę pozbyć się danych nagłówka, aby wynik wyglądał następująco: abcdefghijklmnopqrstuvwx.

Czy istnieją jakieś polecenia w pakiecie narzędzi Unix, które pozwalają mi to zrobić? A ogólnie, czy są jakieś narzędzia do obsługi danych binarnych? Jedyne narzędzie, o którym mogłem myśleć to: od/hexdump, ale jak przekonwertować wynik z powrotem na plik binarny?

+0

Czy te pakiety sieciowe? A co z tcpdump? – AlG

Odpowiedz

3

Użyj xxd, która przechodzi do iz zestawu heksowego.

xxd -c 123 -ps 

wyświetli Twój strumień z 123 bajtami na linię. Aby odwrócić Użyj

xxd -r -p 

Teraz powinno być w stanie umieścić to razem z cut spadać znaków, ponieważ można zrobić coś takiego

cut -c 3- 

aby wszystkie znaki od 3 do końca linii. Nie zapomnij użyć liczby znaków równej 2X, aby uwzględnić dwa heksadecy na bajt.

Więc coś wzdłuż linii

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

gdzie X+Y i 2X+1 są zastępowane rzeczywistymi wartościami liczbowymi. Będziesz musiał umieścić swój strumień danych w odpowiednim miejscu do powyższego polecenia.

+0

, więc pomysł był ok .. 'xxd', nigdy nie słyszałem o tym. Dzięki! uwaga: cięcie pochodzi z '2X + 1'. –

1

Perl jest dość standardowym narzędziem unixowym. Przeprowadź ją do perla. Jeśli ustawiony jest stały bajt długości, powinna działać prosta operacja substr. Oto próbka perla, która powinna działać.

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

Chcesz 'my $ len = 8', aby odczytać 8 bajtów na raz. –

+0

Prawda, ale przynajmniej konfigurowalna;) – bot403

1

Jako jedną wkładką, chciałbym napisać:

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

przykład:

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

produkuje

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

spożywa wiodące znaki nowej linii 'echo -e" \ n00abcdef01 .. "'. dowolny pomysł? –

+0

@ yi_H, tak, idź z odpowiedzią bot403 ["sysread" odpowiedź] (http://stackoverflow.com/questions/7080887/bash-unix-toolchain-binary-stream-processing--licing/7081227#7081227). –

0

Strumień binarny edytor jest narzędzie napisane w Javie do obsługi strumieni. Może być używany zarówno z java, jak i z linii poleceń. https://sourceforge.net/projects/bistreameditor/

ZASTRZEŻENIE: jestem autorem tego narzędzia.

W przeciwieństwie do narzędzi opartych na nowej linii, takich jak sed, pozwala na niestandardowe przechodzenie i przechowywanie danych za pośrednictwem traversal i bufora. Dane binarne można traktować jako znaki jednobajtowe i operacje na łańcuchach/dopasowania dozwolone. Może pisać na wielu wyjściach i używać różnych kodowań. Z powodu tej elastyczności, obecnie linia poleceń ma wiele parametrów, które należy uprościć.

Plik bse.zip powinien zostać pobrany i wykorzystany. Dla powyższego przykładu, chcemy po prostu trzeba zrobić substr (2) na wejściu len 8. pełna linia poleceń jest

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