Perl printf 换行符
Perl printf line breaks
希望在从 j 打印的 100 个字节中的每 16 个字节后添加一个换行符。目前所有 100 个字节都打印在一行上。
任何帮助都将非常充分,谢谢。
for ($j = 6; $j < 106; $j++)
{
printf("%02X ", hex(@bytes[$j]));
}
printf("\t");
谢谢大家。我以另一种方式接近它。最后,视觉方面不是问题,因为我最终还是打印到了文件中。然后将此数据粘贴到十六进制编辑器中,因此格式化是预先考虑的,而不是必需的。下面现在输出的是我最后要查找的所有数据,而不是预定的长度。
for ($j = 6; $j < @bytes; $j = $j + 1)
{
printf outfile ("%02X ", hex(@bytes[$j]));
}
printf("\n");
您可以利用一些 $counter
并打印 \n
一旦 $counter % 16
等于 0
.
use strict;
use warnings;
my @bytes = map { int(rand(255)) } 0..200;
my $counter = 1;
for ( @bytes[6..106] ) {
printf "%02X ", $_;
print "\n" unless $counter++ % 16;
}
print "\n";
输出样本
C9 CA E7 66 13 F5 56 BE 08 68 E4 22 93 77 E0 14
08 4F F3 AD CC F4 66 DE 6C BB 1B E6 CE F3 13 DD
AE 6A CD 9B 5E 98 1F D4 2E C5 80 4B 3E 8E BC BF
5B 27 F9 0D 97 AB 26 C0 11 2D 1D 95 CE 26 3C D8
3C D8 A4 06 0A 48 0D 45 53 28 7E 5D D2 AD 90 5C
03 32 95 48 F6 DB 20 90 A7 62 41 3D D7 AB 7C 3B
CF 3D 0D C2 DA
注意:从 6 到 106 的索引给出 101 个元素
使用 splice()
从数组中一次获取 16 个元素。
我也改用 say()
, join()
, map()
and sprintf()
。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @bytes = map { int(rand(255)) } 0..200;
# As splice is destructive, take a copy of the array.
# Also, let's remove those first six elements and any
# after index 106.
my @data = @bytes[6 .. 105];
while (my @row = splice @data, 0, 16) {
say join ' ', map { sprintf '%02X', $_ } @row;
}
更新:再给你一些 Perl 技巧。
- 始终将
use strict
和 use warnings
添加到您的 Perl 程序的顶部。并解决他们将向您展示的问题。
@bytes[$j]
最好写成 $bytes[$j]
(因为它是一个值)。这是 use warnings
会告诉你的事情之一。
for ($j = 6; $j < 106; $j++)
最好写成 for my $j (6 .. 105)
。出现“差一个”错误的可能性较小。
- 实际上,由于您只是使用
$j
从数组中获取元素,您可能只想直接遍历数组的元素 - for my $elem (@bytes[6 .. 105])
(然后使用 $elem
代替 $bytes[$j]
).
短而快:
sub hex_dump {
my $i = 0;
my $d = uc unpack 'H*', pack 'C*', @_;
$d =~ s{ ..\K(?!\z) }{ ++$i % 16 ? " " : "\n" }xseg;
return "$d\n";
}
print hex_dump(@bytes[6..105]);
还有非常干净的 splice
循环方法。
sub hex_dump {
my $d = '';
$d .= join(" ", map sprintf("%02X", $_), splice(@_, 0, 16)) . "\n" while @_;
return $d;
}
print hex_dump(@bytes[6..105]);
因为这种方法一次生成一行,所以非常适合重新创建传统的十六进制转储格式(显示偏移量和可打印字符)。
$ hexdump -C a.pl
00000000 75 73 65 20 73 74 72 69 63 74 3b 0a 75 73 65 20 |use strict;.use |
00000010 77 61 72 6e 69 6e 67 73 3b 0a 0a 73 75 62 20 68 |warnings;..sub h|
00000020 65 78 5f 64 75 6d 70 20 7b 0a 20 20 20 6d 79 20 |ex_dump {. my |
...
000000a0 74 65 73 20 3d 20 30 2e 2e 32 35 35 3b 0a 0a 70 |tes = 0..255;..p|
000000b0 72 69 6e 74 20 68 65 78 5f 64 75 6d 70 28 40 62 |rint hex_dump(@b|
000000c0 79 74 65 73 5b 36 2e 2e 31 30 35 5d 29 3b 0a |ytes[6..105]);.|
000000cf
您也可以使用 for 循环。您将遍历索引,并根据您正在打印的字节的索引打印 space 或换行符。
sub hex_dump {
my $d = '';
for my $i (0..$#_) {
$d .= sprintf("%02X%s", $_[$i], $i == $#_ || $i % 16 == 15 ? "\n" : " ");
}
return $d;
}
print hex_dump(@bytes[6..105]);
希望在从 j 打印的 100 个字节中的每 16 个字节后添加一个换行符。目前所有 100 个字节都打印在一行上。
任何帮助都将非常充分,谢谢。
for ($j = 6; $j < 106; $j++)
{
printf("%02X ", hex(@bytes[$j]));
}
printf("\t");
谢谢大家。我以另一种方式接近它。最后,视觉方面不是问题,因为我最终还是打印到了文件中。然后将此数据粘贴到十六进制编辑器中,因此格式化是预先考虑的,而不是必需的。下面现在输出的是我最后要查找的所有数据,而不是预定的长度。
for ($j = 6; $j < @bytes; $j = $j + 1)
{
printf outfile ("%02X ", hex(@bytes[$j]));
}
printf("\n");
您可以利用一些 $counter
并打印 \n
一旦 $counter % 16
等于 0
.
use strict;
use warnings;
my @bytes = map { int(rand(255)) } 0..200;
my $counter = 1;
for ( @bytes[6..106] ) {
printf "%02X ", $_;
print "\n" unless $counter++ % 16;
}
print "\n";
输出样本
C9 CA E7 66 13 F5 56 BE 08 68 E4 22 93 77 E0 14
08 4F F3 AD CC F4 66 DE 6C BB 1B E6 CE F3 13 DD
AE 6A CD 9B 5E 98 1F D4 2E C5 80 4B 3E 8E BC BF
5B 27 F9 0D 97 AB 26 C0 11 2D 1D 95 CE 26 3C D8
3C D8 A4 06 0A 48 0D 45 53 28 7E 5D D2 AD 90 5C
03 32 95 48 F6 DB 20 90 A7 62 41 3D D7 AB 7C 3B
CF 3D 0D C2 DA
注意:从 6 到 106 的索引给出 101 个元素
使用 splice()
从数组中一次获取 16 个元素。
我也改用 say()
, join()
, map()
and sprintf()
。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @bytes = map { int(rand(255)) } 0..200;
# As splice is destructive, take a copy of the array.
# Also, let's remove those first six elements and any
# after index 106.
my @data = @bytes[6 .. 105];
while (my @row = splice @data, 0, 16) {
say join ' ', map { sprintf '%02X', $_ } @row;
}
更新:再给你一些 Perl 技巧。
- 始终将
use strict
和use warnings
添加到您的 Perl 程序的顶部。并解决他们将向您展示的问题。 @bytes[$j]
最好写成$bytes[$j]
(因为它是一个值)。这是use warnings
会告诉你的事情之一。for ($j = 6; $j < 106; $j++)
最好写成for my $j (6 .. 105)
。出现“差一个”错误的可能性较小。- 实际上,由于您只是使用
$j
从数组中获取元素,您可能只想直接遍历数组的元素 -for my $elem (@bytes[6 .. 105])
(然后使用$elem
代替$bytes[$j]
).
短而快:
sub hex_dump {
my $i = 0;
my $d = uc unpack 'H*', pack 'C*', @_;
$d =~ s{ ..\K(?!\z) }{ ++$i % 16 ? " " : "\n" }xseg;
return "$d\n";
}
print hex_dump(@bytes[6..105]);
还有非常干净的 splice
循环方法。
sub hex_dump {
my $d = '';
$d .= join(" ", map sprintf("%02X", $_), splice(@_, 0, 16)) . "\n" while @_;
return $d;
}
print hex_dump(@bytes[6..105]);
因为这种方法一次生成一行,所以非常适合重新创建传统的十六进制转储格式(显示偏移量和可打印字符)。
$ hexdump -C a.pl
00000000 75 73 65 20 73 74 72 69 63 74 3b 0a 75 73 65 20 |use strict;.use |
00000010 77 61 72 6e 69 6e 67 73 3b 0a 0a 73 75 62 20 68 |warnings;..sub h|
00000020 65 78 5f 64 75 6d 70 20 7b 0a 20 20 20 6d 79 20 |ex_dump {. my |
...
000000a0 74 65 73 20 3d 20 30 2e 2e 32 35 35 3b 0a 0a 70 |tes = 0..255;..p|
000000b0 72 69 6e 74 20 68 65 78 5f 64 75 6d 70 28 40 62 |rint hex_dump(@b|
000000c0 79 74 65 73 5b 36 2e 2e 31 30 35 5d 29 3b 0a |ytes[6..105]);.|
000000cf
您也可以使用 for 循环。您将遍历索引,并根据您正在打印的字节的索引打印 space 或换行符。
sub hex_dump {
my $d = '';
for my $i (0..$#_) {
$d .= sprintf("%02X%s", $_[$i], $i == $#_ || $i % 16 == 15 ? "\n" : " ");
}
return $d;
}
print hex_dump(@bytes[6..105]);