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も含める)同士の間にはスペースを挟むことができます。 a、A、b、B、h、H以外のフォーマットは、第2引数LISTからCOUNTで指定された分の値を使います。aやAというフォーマットに対してCOUNTを使うと、繰り返し数で示す長さの文字列となるように、必要に応じてヌル文字かスペース文字を付け足します。unpackするとき、Aは後続のスペース文字やヌル文字を取り除きますが、aはそのままにします。
同様に、bやBは、繰り返し数で示すビット長のビット列にパックします。hやHは、そのニブル長のニブル列にパックします。Pは、指定した長さの構造体へのポインタをパックします。実数 (floatとdouble) は、機種依存のフォーマットしかありません。あるマシンで
パックした浮動小数点数は、別のマシンでは読めない可能性があります。
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関数でも使用できます。