2011-05-12 73 views
2

我正在调试通过TCP传输数据的程序的输出。 为了调试目的,我把它换成接收程序与netcathexdump壳魔法想要的:在管道中输出hexdump的格式

netcat -l -p 1234 | hexdump -C 

输出的所有数据作为一个很好hexdump都可以,就像我想要的。现在的数据被以固定的块,其长度不是16的倍数传送,导致在输出中偏移线,使点样差异有点困难:

00000000 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |P...............| 
00000010 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.P..............| 
00000020 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 |..P.............| 

如何格式化输出,使得后17个字节的新行开始了? 它应该是这个样子:

50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |P...............| 
00            |.    | 
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |P...............| 
00            |.    | 
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |P...............| 
00            |.    | 

使用hexdumps -n参数不起作用,因为它会到达的字节数后退出。 (除非有办法让netcat程序继续运行,并将下一个字节无缝地连接到一个新的hexdump实例)。

另外,如果我可以在输出上使用watch -d来获得线条间变化的高亮显示,那将是非常好的选择。

+0

六角部分就足够了。 – grimmig 2011-05-12 07:50:28

+1

您是否阅读过关于hexdump手册页上所有格式选项的内容?它看起来像你应该能够轻松地做你想要的... – 2011-05-12 07:57:00

+3

我为你添加了“perl”标签,这些人可能会吃掉这个,你有Perl踢,对吧? – 2011-05-12 07:57:43

回答

3

对于没有字符部分的hexdump。

hexdump -e '16/1 "%0.2x " "\n" 1/1 "%0.2x " "\n"'

3

我用这个:

use strict; 
use warnings; 
use bytes; 

my $N = $ARGV[0]; 

$/ = \$N; 

while (<STDIN>) { 
    my @bytes = unpack("C*", $_); 
    my $clean = $_; 
    $clean =~ s/[[:^print:]]/./g; 
    print join(' ', map {sprintf("%2x", $_)} @bytes), 
    " |", $clean, "|\n"; 
} 

运行它perl scriptname.pl N其中N是你希望每个块的字节数。