Go to the first, previous, next, last section, table of contents.

pack

`pack(TEMPLATE,LIST)'
配列または値のリストを引数にとり、バイナリ構造体に 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 を用いることができる。

Go to the first, previous, next, last section, table of contents.