6

我正在调试通过 TCP 传输数据的程序的输出。出于调试目的,我已将接收程序替换为netcatand 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在输出上使用来突出显示行之间的变化,那也很棒。

4

3 回答 3

5

对于没有字符部分的 hexdump。

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

于 2011-05-12T08:07:34.133 回答
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 是您想要的每个块中的字节数。

于 2011-05-12T08:11:22.310 回答
1

您也可以xxd -p用来制作 hexdump 。

于 2013-06-24T09:36:06.183 回答