配列または値のリストを引数にとり、バイナリ構造体に pack
する。
構造体を含む文字列を返す。TEMPLATE
はひと続きの文字列で、
各文字は以下のように値のオーダーおよびタイプを表す。
A アスキー文字列(スペースが pad される)
a アスキー文字列(ヌルが pad される)
c signed char
C unsigned char
s signed short
S unsigned short
i signed integer
I unsigned integer
l signed long
L unsigned long
n short( "network" オーダー)
N long( "network" オーダー)
f 単精度浮動小数点(native format)
d 倍精度浮動小数点( 〃 )
p string へのポインタ
x null byte
X back up a byte(?)
@ 絶対位置までヌルで埋める
u uuencode された文字列
b ビット文字列
(vec()
のような、昇順のビットオーダー(ascending bit order))
B ビット文字列(降順のビットオーダー(descending bit order))
h 16進文字列(低 nybble が先に来る)
H 16進文字列(高 nybble が先に来る)
オプションとして数字を各文字の後につけて、繰り返し数を指定することができる。
`a'、`A'、`b'、`B'、`h'、`H' 以外のタイプでは、
指定された数の値を LIST
から取る。
リピート値として *
を使うと残り全部を示す。
`a' と `A' では、値は一つで、指定された長さの一つの文字列として、
必要ならヌルやスペースを pad する。
(unpack
の際には、
`A' は後に続くスペースやヌルを取り除くが、
`a' の場合はそうではない。)
同様に、`b' と `B' は指定したビット数分の文字列を pack する。
`h' と `H' は指定した数の nybbles を pack する。
実数(単精度、倍精度)は native machine format のみである。
浮動小数点のフォーマットにはいろいろあり、
標準の network 表現がないので、交換することはできない。
このため、あるマシンで pack
された浮動小数点データは
他のマシンでは読むことができない ---
たとえ両方共 IEEE の floating point arithmetic を使っていたとしても
(メモリ表現の endian-ness は IEEE のスペックにはないから)。
perl は内部の全数値計算に倍精度を用いているので、
double -> float -> double という変換をすると精度が悪くなる
(すなわち、unpack("f", pack("f", $foo))
は
普通 $foo
と一致しない)ことに注意。
$foo = pack("cccc",65,66,67,68);
# foo は "ABCD" となる
$foo = pack("c4",65,66,67,68);
# 同じこと
$foo = pack("ccxxcc",65,66,67,68);
# foo は "AB\0\0CD" となる
$foo = pack("s2",1,2);
# リトル・エンディアンでの "\1\0\2\0"
# ビッグ・エンディアンでの "\0\1\0\2"
$foo = pack("a4","abcd","x","y","z");
# "abcd"
$foo = pack("aaaa","abcd","x","y","z");
# "axyz"
$foo = pack("a14","abcdefg");
# "abcdefg\0\0\0\0\0\0\0"
$foo = pack("i9pl", gmtime);
# 実際の構造体 tm (私のシステムでは)
sub bintodec {
unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
unpack
関数でも、同じ template
を用いることができる。