pack データをバイナリ文字列にパックする &reftitle.description; stringpack stringformat mixedvalues 指定された引数を format に基づいて バイナリ文字列にパックします。 この関数のアイデアは Perl からのものであり、フォーマット指定用の コードは Perl と同様に動作します。しかし、中には存在しない書式コードもあります。 たとえば Perl の "u" は存在しません。 符号付及び符号無しの区別は関数 unpack にのみ 影響を与えます。関数 pack は符号付及び符号無しの フォーマットコードのどちらでも同じ結果となることに注意しましょう。 &reftitle.parameters; format フォーマット文字列は、 フォーマットコードの後にオプションの反復指定用引数が続く形式と なっています。反復指定用引数として整数値、または入力データの最後まで 反復を意味する * のどちらかを指定することができます。 a, A, h, H の場合、 反復数はそのデータ引数が取得する文字の数を指定します。反復数が @ の場合、 次のデータを置く場所の絶対位置を表します。その他の場合、反復数は データ引数が使われる数を指定し、結果のバイナリ文字列にパックされます。 現在、実装されているものを以下に示します。 <function>pack</function> の書式文字 コード 説明 a NUL で埋めた文字列 A 空白で埋めた文字列 h 十六進文字列、下位ニブルが先 H 十六進文字列、上位ニブルが先csigned char C unsigned char s signed short (常に 16 ビット、マシンのバイトオーダー) S unsigned short (常に 16 ビット、マシンのバイトオーダー) n unsigned short (常に 16 ビット、ビッグエンディアンバイトオーダー) v unsigned short (常に 16 ビット、リトルエンディアンバイトオーダー) i signed integer (サイズおよびバイトオーダーはマシン依存) I unsigned integer (サイズおよびバイトオーダーはマシン依存) l signed long (常に 32 ビット、マシンのバイトオーダー) L unsigned long (常に 32 ビット、マシンのバイトオーダー) N unsigned long (常に 32 ビット、ビッグエンディアンバイトオーダー) V unsigned long (常に 32 ビット、リトルエンディアンバイトオーダー) q signed long long (常に 64 ビット、マシンのバイトオーダー) Q unsigned long long (常に 64 ビット、マシンのバイトオーダー) J unsigned long long (常に 64 ビット、ビッグエンディアンバイトオーダー) P unsigned long long (常に 64 ビット、リトルエンディアンバイトオーダー) f float (サイズおよび表現はマシン依存) g float (サイズはマシン依存。 リトルエンディアンバイトオーダー) G float (サイズはマシン依存。 ビッグエンディアンバイトオーダー) d double (サイズおよび表現はマシン依存) e double (サイズはマシン依存。 リトルエンディアンバイトオーダー) E double (サイズはマシン依存。 ビッグエンディアンバイトオーダー) x NUL バイト X 1 バイト戻る Z NUL 埋め文字列 @ 絶対位置まで NUL で埋める
values
&reftitle.returnvalues; バイナリ文字列を含むデータを返します。 &reftitle.changelog; &Version; &Description; 8.0.0 この関数は、失敗時に &false; を返さなくなりました。 7.2.0 floatdouble 型は、ビッグエンディアンとリトルエンディアンを両方サポートしました。 7.0.15,7.1.1 "e", "E", "g" および "G" コードが、float と double のバイトオーダーをサポートするために追加されました。 &reftitle.examples; <function>pack</function> の例 ]]> この結果のバイナリ文字列の長さは 6 バイト長で、バイト列 0x12, 0x34, 0x78, 0x56, 0x41, 0x42となります。 &reftitle.notes; PHP は、int 型の値を内部的に格納する際に サイズがマシン依存の符号付き値 (C の long 型) を使うことに注意しましょう。int 型の範囲外の数値となる整数リテラルや演算結果は float として保持されます。この float 値を integer としてパックする際には まず最初に integer 型へのキャストを行います。 その結果、できあがるバイトパターンは期待通りにはならないかもしれません。 この問題にもっとも関連するのが、符号なしの数値で int 型で表現できるものをパックする場合です。 int 型のサイズが 32 ビットであるシステムでのキャスト結果は、 (実装で定義されている標準 C の符号なし型から符号付き型への変換に依存しますが) まるで int が符号なし整数であるかのような同一のバイトパターンになることがよくあります。 int 型のサイズが 64 ビットであるシステムでは、 たいていの場合は float の仮数部のサイズが足りず、 値の精度を損なわずに保持することができません。 ネイティブの 64 ビット C int 型を持つシステム (UNIX 系システムのほとんどは持っていません) では、上側の範囲の値で パック書式 I を使うための唯一の方法は、 希望する符号なし値と同じバイト表現になるような負の int 値を作ることになります。 &reftitle.seealso; unpack