小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

pack関数とunpack関数の基本を理解する

一般的に、packは包み込むことで、unpackはその逆です。


Perlでのpack関数は、リスト値を型指定で包み込んで、バイナリ値に変換します。unpack関数はその逆です。


バイナリ値とは、たとえば、見た目『123』は、内部的には16進の『313233』で、バイナリ値です。
つぎに、リスト値『313233』を16進上位ニブル型指定("H*")でパックしてみます。
すると、見た目バイナリ値が『123』になるのです。

print pack("H*", 313233); #内部的には16進の『313233』である見た目バイナリ値『123』が表示される

つぎに、見た目バイナリ値『123』を16進上位ニブル型指定("H*")でアンパックしてみます。
すると、リスト値『313233』が表示されます。

print unpack("H*", 123); #リスト値『313233』が表示される

尚、16進上位ニブル型指定("H*")とは、16進数で左から4ビットずつ変換すること。
ちなにみ、ニブルとは、4ビットのことで、8ビットをバイトと呼ぶのと同じ感じです。


別の例として、符号なしchar型指定("C*")で『65,66,67』のリストをパックしてみます。
すると、見た目バイナリ値『ABC』が表示されます。

print pack("C*", 65,66,67); # 見た目バイナリ値『ABC』が表示される

見た目バイナリ値『ABC』をアンパックすると元のリストが求められる。

@aaa = unpack("C*", pack("C*", 65,66,67));
print $aaa[0], "\n"; # リスト値『65』が表示される
print $aaa[1], "\n"; # リスト値『66』が表示される
print $aaa[2], "\n"; # リスト値『67』が表示される