16進数を10進数に変換するテーブル表

投稿者: Anonymous

perlでテーブル表を作成するとき、行と列の項目はどういう基準で決定しますか?
項目ごとのデータを入れたいとき、どのようにすればよいですか。
下記のコードでは仕組みは分かりませんが、行と列は分かれております。

open (my $f, ">", "table.txt") or die "cannot open textfile : $!n";
printf $f "%4s", "";
for ( my $item = 0 ; $item < 16 ; $item++ ) {
  printf $f "%4X ", $item;
}
for ( my $num16 = 0 ; $num16 <=1023 ; $num16++ ) {
  printf $f "n%3X ", $num16;
  printf $f "%04d ", $num16;
}
close($f);

解決

行と列の項目はどういう基準で決定しますか?

よくわからない部分がありますけど、
今16進数を10進数に変換するテーブルということなので、

    0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
0   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
1  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
...
A 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

のようなものを想定していると思いますので、
列名は、0~Fで行名は、0から16毎の16進数でいいかと思います。

こういう縦・横の(つまり2次元の)データは2次元配列で保持するといいかと思います。
Perl でいう配列は1次元配列で、2次元配列は配列(の参照)の配列というような形で実現します。(C言語で言えばダブルポインタで実現するもののような感じです。)
この場合の具体的な初期化は例えば次のようにします。

my @table = ();
for(my $i=0; $i < 1024; $i += 16){#16要素ずつ追加
    push(@table, [$i..($i+15)]);#配列の最後に配列(例[0..15]0から15の要素を持つ配列)を追加する
}

そうすると、

print $table[0xA][0x1];#Aの1の要素(つまり0xA1を意味する)161が表示される。
$table[0xA][0x1] = 161;#Aの1の要素に161を代入する。

のように行と列で扱えるようになります。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *