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