bash/unix工具链二进制流处理/切片

bash/unix工具链二进制流处理/切片,bash,unix,binary-data,Bash,Unix,Binary Data,我在标准输入上有一个二进制流,它是固定大小的格式,一个连续的数据包流,每个数据包有一个长度为X的头和一个长度为Y的体 因此,如果X=2y=6,那么它类似于00abcdef01ghijkl02mnopqr03stuvxx,但它是二进制的,头和数据都可以包含任何“字符”(包括“\0”和换行符),示例只是为了可读性 我想去掉标题数据,因此输出如下:abcdefghijklmnopqrstuvxx unix工具链中是否有允许我执行此操作的命令?一般来说,有没有处理二进制数据的工具?我能想到的唯一工具是o

我在标准输入上有一个二进制流,它是固定大小的格式,一个连续的数据包流,每个数据包有一个长度为X的头和一个长度为Y的体

因此,如果X=2y=6,那么它类似于
00abcdef01ghijkl02mnopqr03stuvxx
,但它是二进制的,头和数据都可以包含任何“字符”(包括“\0”和换行符),示例只是为了可读性

我想去掉标题数据,因此输出如下:
abcdefghijklmnopqrstuvxx


unix工具链中是否有允许我执行此操作的命令?一般来说,有没有处理二进制数据的工具?我能想到的唯一工具是
od
/
hextump
,但是如何将结果转换回二进制?

使用
xxd
,它可以往返于hextump

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
替换为实际数值。您需要将数据流放在适合上述命令的位置。

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;

还有
bbe-二进制块编辑器
,它是一种二进制
sed
,用于以Unix方式处理二进制数据


作为一行,我要写:

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

二进制流编辑器是用java编写的用于处理流的工具。 它可以从java和命令行中使用。

免责声明:我是此工具的作者

与sed等基于行的新工具不同,它允许通过遍历和缓冲区进行自定义遍历和数据存储。二进制数据可以被视为单字节字符,并且允许进行字符串操作/匹配。它可以写入多个输出并使用不同的编码。由于这种灵活性,目前命令行有很多参数,需要简化

应下载并使用bse.zip文件。 对于上面的例子,我们只需要对len8的输入执行substr(2)。完整的命令行是

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

这些是网络包吗?tcpdump呢?那么这个主意还可以<代码>xxd,从未听说过。谢谢注意:切割来自
2X+1
。正确,但至少是可配置的;)删除前导换行符
echo-e“\n00abcdef01..”
。有什么想法吗?@yiuh,是的,跟403一起去。