希望在從j列印的100個位元組中的每16個位元組后添加一個換行符。目前,所有100個位元組都列印在一行上。
任何幫助都將是巨大的,謝謝。
for($j = 6; $j < 106; $j )
{
printf("X", hex(@bytes[$j]))。
}
printf(" ")。
謝謝大家。我以另一種方式來處理它。最后,視覺方面的問題并不重要,因為我最終還是要列印到檔案。這些資料會被粘貼到一個十六進制編輯器中,所以格式化是一種預先考慮,而不是一種需要。以下是我最終要輸出的所有資料,而不是預先確定的長度。
for ($j = 6; $j < @bytes; $j = $j 1)
{
printf outfile ("X", hex(@bytes[$j])。
}
printf("
")。)
uj5u.com熱心網友回復:
使用splice()來從你的陣列中一次抓取16個元素。
我也改用say(),join(),map()和sprintf()。
#!/usr/bin/perl
use strict;
使用警告。
use feature 'say';
my @bytes = map { int(rand(255)) } 0...200。
# 由于拼接是破壞性的,所以要對陣列進行復制。
# 另外,讓我們洗掉那些前六個元素和任何的元素。
# 索引106之后。
my @data = @bytes[6 ... 105] 。
while (my @row = splice @data, 0, 16) {
say join ' ', map { sprintf 'X', $_ }. @row;
}
更新:為你提供更多的Perl提示。
- 總是在你的Perl程式的頂部添加
use strict和use warnings。并修復他們將向你展示的問題。 @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])。
uj5u.com熱心網友回復:
你可以利用一些$counter并列印。
一旦$counter % 16等于0.
use strict;
use warnings;
my @bytes = map { int(rand(255))。} 0...200。
my $counter = 1。
for ( @bytes[6.106] ) {
printf "X" , $_;
print "
" unless $counter % 16;
}
print "
"。
輸出示例
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 F313 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 3 D 7 AB 7 C 3 B
CF 3D 0D C2 DA
注意:從6到106的索引給出了101個元素
。uj5u.com熱心網友回復:
簡短而快速:
sub hex_dump {
my $i = 0;
my $d = uc unpack 'H*'/span>, pack 'C*'/span>, @_;
$d =~ s{ .K(?!z) }{ $i % 16 ? " " : "
" }xseg。
return "$d
"。
}
print hex_dump(@bytes[6..105])。
還有一種非常干凈的splice回圈方法。
sub hex_dump {
my $d = ''/span>;
$d . = join(" ", map sprintf(" X" /span>, $_), splice(@_, 0, 16)) . "
" 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 |警告;.sub h|
00000020 65 78 5f 64 75 6d 70 20 7b 0a 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 |位元組[6..105]);.|
000000cf
你也可以使用一個for回圈。你將迭代索引,并根據你要列印的位元組的索引,列印一個空格或換行。
sub hex_dump{
my $d = ''/span>;
for my $i (0.$#_) {
$d .= sprintf("X%s", $_[$i], $i ==$#_ || $i % 16 ==15 ? "
" : " ")。)
}
return $d;
}
print hex_dump(@bytes[6..105])。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311345.html
標籤:
上一篇:Perl-撤銷查找變數-為什么?
