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
関数でも使用できます。