pack TEMPLATE,LIST

広告

広告

解説

配列か値のリストをとり、バイナリの構造体に入れてその構造体を含む文字列を返します。TEMPLATE は以下のような値の型と順番を指定する文字を並べたものとなります。

aASCII 文字列、ヌル文字で埋める
AASCII 文字列、スペース文字で埋める
bビット列 (昇ビット順、vec() と同じ)
Bビット列 (降ビット順)
h16 進数文字列 (低位ニブルが先)
H16 進数文字列 (高位ニブルが先)
csigned char 値
Cunsigned char 値
ssigned short 値
Sunsigned short 値
isigned int 値
Iunsigned int 値
lsigned long 値
Lunsigned long 値
n"network" 順序 (ビッグエンディアン) の short
N"network" 順序 (ビッグエンディアン) の long
v"VAX" 順序 (リトルエンディアン) の short
V"VAX" 順序 (リトルエンディアン) の long
f機種依存の単精度浮動小数点数
d機種依存の倍精度浮動小数点数
pヌル文字で終端する文字列へのポインタ
P構造体 (固定長文字列) へのポインタ
uuuencode 文字列
xヌル文字
X1 文字後退
@絶対位置までヌル文字で埋める

これらの文字の後には繰り返し数を示す数字を付けることができます。"a"、"A"、"b"、"B"、"h"、"H" 以外の型を使うとき、pack 関数はLIST からその数の値を取り出して使います。くり返し数に * を指定するとその時点で残っているすべての要素を意味します。"a" や"A" という型を使うと値を一つだけ取り出して使いますが、繰り返し数で示す長さの文字列となるように必要に応じて NULL 文字かスペース文字を付け足します。unpack するとき"A" は後続のスペース文字やヌル文字を取り除きますが、"a" はそのままにします。同様に"b" や"B" は繰り返し数で示すビット長のビット列に pack します(LIST から要素を 1 つだけ取り出しその要素を文字列と見て各文字の下位 1 ビットづつを取り出して pack /最終的に半端なビットは 0 で埋められる)。"h" や "H" は、そのニブル長のニブル列に pack します。"P" は、指定した長さの構造体へのポインタを pack します。実数 (float と double) は、機種依存のフォーマットしかありません。いろんな浮動小数点数のフォーマットが在り標準的な表現といったものがないため、データ交換のための機能は用意されていません。つまりあるマシンで pack した浮動小数点数は別のマシンでは読めないかもしれないということになります。たとえ双方で IEEE フォーマットの浮動小数点数演算を行なっていても同様(IEEE の仕様ではメモリ表現上のバイト順序までは規定されていないから)。Perl ではすべての数値演算のために内部的に double を使用しています。double から float へ変換し、それから再び double に戻すと精度が落ちることになります。一般にはpack で使用したものと同じテンプレートがunpack 関数でも使用できます。

使用例

ソース

$foo = pack("cccc",65,66,67,68);
print "$foo\n";
$foo = pack("c4",65,66,67,68);
print "$foo\n";
$foo = pack("ccxxcc",65,66,67,68);
print "$foo\n";
$foo = pack("s2",1,2);
print "$foo\n";
$foo = pack("a4","abcd","x","y","z");
print "$foo\n";
$foo = pack("aaaa","abcd","x","y","z");
print "$foo\n";
$foo = pack("a14","abcdefg");
print "$foo\n";

結果

ABCD
ABCD
AB\0\0CD
\1\0\2\0
abcd
axyz
abcdefg\0\0\0\0\0\0\0

参照

広告

Copyright (C) 2003-2006 七鍵 key@do.ai 初版:2003年07月07日 最終更新:2006年08月08日