5部 関数リファレンス

pack

pack TEMPLATE, LIST



第2引数LISTをバイナリの構造体にパックしたものを文字列をして返します。第1引数TEMPLATEはフォーマット文字を並べて、値の順番と型を示すようにしたものです。

フォーマット文字には次のものがあります。

フォーマット 意味
a ASCII 文字列
A ASCII 文字列、足りない領域はスペース文字で埋める
b ビット列 (昇ビット順)
B ビット列 (降ビット順)
c 符号付き char 値
C 符号なし char 値
d 機種依存の倍精度浮動小数点数
f 機種依存の単精度浮動小数点数
h 16進数文字列 (下位ビットが先)
H 16進数文字列 (上位ビットが先)
i 符号付き int 値
I 符号なし int 値
l 符号付き long 値
L 符号なし long 値
n ネットワークバイト順序 (ビッグエンディアン) の short 値
N ネットワークバイト順序 (ビッグエンディアン) の long 値
p 文字列へのポインタ
P 構造体 (固定長文字列) へのポインタ
s 符号付き short 値
S 符号なし short 値
v VAXバイト 順序 (リトルエンディアン) の short 値
V VAXバイト 順序 (リトルエンディアン) の long 値
u uuencode した文字列
x ヌル文字
X 1バイト後退
@ 絶対位置までヌル文字で埋める

フォーマット文字の使い方

  • フォーマット文字の後ろには、それを何回繰り返すかを示す数字COUNTを付けることができます。
  • COUNTに * を指定すると、残っているすべての要素を使います。
  • フォーマット文字(COUNTも含める)同士の間にはスペースを挟むことができます。
  • aAbBhH以外のフォーマットは、第2引数LISTからCOUNTで指定された分の値を使います。
  • aAというフォーマットに対してCOUNTを使うと、繰り返し数で示す長さの文字列となるように、必要に応じてヌル文字かスペース文字を付け足します。unpackするとき、Aは後続のスペース文字やヌル文字を取り除きますが、aはそのままにします。
    同様に、bBは、繰り返し数で示すビット長のビット列にパックします。 
  • hHは、そのニブル長のニブル列にパックします。
  • Pは、指定した長さの構造体へのポインタをパックします。実数 (floatdouble) は、機種依存のフォーマットしかありません。あるマシンで
    パックした浮動小数点数は、別のマシンでは読めない可能性があります。

Perlは、すべての数値演算で内部的にdoubleを使用しています。ですから、doubleからfloatへ変換し、それから再びdoubleに戻すと精度が落ちることになります (unpack("f",pack("f", $foo)) は、$fooと同じではありません)。

packの使い方

# 次の2行は数値をパックしてバイトの並びにします。
print pack("cccc",65,66,67,68), "\n";
> ABCD
print pack("c4",65,66,67,68), "\n";
> ABCD
# "a" フィールドの長さ指定は、1つの文字だけに適用されます
print pack("a4","abcdefg","X","Y","Z"), "\n";

> abcd
# 上記の制限を回避するには、"a"フィールドを繰り返します
print pack("a" x 4, "abcdefg","X","Y","Z"), "\n";

> aXYZ
# "a" フォーマットは、長さが足りない分をヌル文字で補います
print pack("A14","abcdefg"), "...\n";

> abcdefg          ... 

packで使用したものと同じテンプレートが、unpack関数でも使用できます。

関連記事