Shell 魔法需求:在管道中格式化 hexdump 的输出

8

我正在调试通过TCP传输数据的程序输出。为了调试目的,我已经用netcathexdump替换了接收程序:

netcat -l -p 1234 | hexdump -C

这会将所有数据输出为漂亮的十六进制转储,几乎符合我的要求。现在传输的数据是固定块,长度不是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                                                |.               |

使用十六进制转储命令的-n参数不起作用,因为它会在达到指定字节数后退出。(除非有一种方法可以保持netcat程序运行并无缝地将下一个字节传输到新的hexdump实例中)。
此外,如果我可以在输出上使用watch -d,以便突出显示行之间的更改,那就太棒了。

十六进制部分就足够了。 - grimmig
1
您是否已经阅读了十六进制转储手册页面上有关格式选项的所有内容?看起来您应该可以轻松地实现您所需要的功能... - Paul R
3
我为你添加了“perl”标签,那些人可能会对此感兴趣,你手头有Perl吧? - mu is too short
3个回答

6

针对没有字符的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是您想要的每个块中的字节数。


2

同时,您也可以使用xxd -p命令来生成十六进制转储文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接