bash / unix toolchain двоичная обработка потока / нарезка - PullRequest
6 голосов
/ 16 августа 2011

У меня есть двоичный поток на стандартном входе, он в формате фиксированного размера, непрерывный поток пакетов, каждый пакет имеет заголовок с длиной X и тело с длиной Y.

Так что если X = 2 Y = 6, то это что-то вроде 00abcdef01ghijkl02mnopqr03stuvwx, но это двоичный файл, и заголовок и данные могут содержать любые"символы" (включая '\ 0' и символ новой строки), пример только для удобства чтения.

Я хочу избавиться от данных заголовка, чтобы выходные данные выглядели так: abcdefghijklmnopqrstuvwx.

Существуют ли какие-либо команды в наборе инструментов Unix, которые позволяют мне это делать? И вообще есть ли инструменты для обработки двоичных данных? Единственный инструмент, о котором я могу подумать, это od / hexdump, но как преобразовать результат обратно в двоичный файл?

Ответы [ 5 ]

3 голосов
/ 16 августа 2011

Используйте xxd, который идет в и из hexdump.

xxd -c 123 -ps

выведет ваш поток с 123 байтами на строку.Для обратного использования используйте

xxd -r -p

Теперь вы можете соединить это с cut для удаления символов, поскольку вы можете сделать что-то вроде

cut -c 3-

, чтобы получить все символы от 3 доконец строки.Не забудьте использовать количество символов, равное 2X, для учета двух шестнадцатеричных символов на байт.

Итак, что-то вроде

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

, где X+Y и 2X+1заменяются фактическими числовыми значениями.Вам нужно будет поместить свой поток данных где-то в соответствии с приведенной выше командой.

1 голос
/ 16 августа 2011

Как однострочник, я бы написал:

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

пример:

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

производит

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
1 голос
/ 16 августа 2011

Perl - довольно стандартный инструмент Unix.Труба это на Perl.Если его байты фиксированной длины выровнены, простая операция substr должна работать.Вот пример Perl, который должен работать.

#!/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 голосов
/ 29 августа 2016

Бинарный редактор потоков - это инструмент, написанный на Java для обработки потоков.Его можно использовать как из Java, так и из командной строки.https://sourceforge.net/projects/bistreameditor/

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я являюсь автором этого инструмента.

В отличие от инструментов на основе новой строки, таких как sed, он позволяет настраивать обход и сохранение данных через обход и буфер.Двоичные данные могут рассматриваться как однобайтовые символы и допустимые строковые операции / совпадения.Он может записывать на несколько выходов и использовать разные кодировки.Из-за этой гибкости в настоящее время командная строка имеет много параметров, которые необходимо упростить.

Файл bse.zip должен быть загружен и использован.Для приведенного выше примера нам просто нужно сделать substr (2) на входе len 8. Полная командная строка:

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
0 голосов
/ 16 августа 2011

Существует также bbe - binary block editor, который является своего рода двоичным кодом sed для обработки двоичных данных способом Unix.

http://bbe -. Sourceforge.net

...