関数・クラス解説

pack

version:PHP 4, PHP 5, PHP 7 (公式)

データをバイナリ文字列にパックする

公式リファレンス

書式

pack ( string $format , mixed ...$values ) : string|false

説明

指定された引数を format に基づいて バイナリ文字列にパックします。

この関数のアイデアは Perl からのものであり、フォーマット指定用の コードは Perl と同様に動作します。しかし、中には存在しない書式コードもあります。 たとえば Perl の "u" は存在しません。

符号付及び符号無しの区別は関数 unpack() にのみ 影響を与えます。関数 pack() は符号付及び符号無しの フォーマットコードのどちらでも同じ結果となることに注意しましょう。

パラメータ

format
フォーマット文字列は、 フォーマットコードの後にオプションの反復指定用引数が続く形式と なっています。反復指定用引数として整数値、または入力データの最後まで 反復を意味する * のどちらかを指定することができます。 a, A, h, H の場合、 反復数はそのデータ引数が取得する文字の数を指定します。反復数が @ の場合、 次のデータを置く場所の絶対位置を表します。その他の場合、反復数は データ引数が使われる数を指定し、結果のバイナリ文字列にパックされます。 現在、実装されているものを以下に示します。
pack() の書式文字
コード 説明
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 埋め文字列 (PHP 5.5 以降)
@ 絶対位置まで NUL で埋める
values

返値

バイナリ文字列を含むデータを返します。失敗した場合に FALSE を返します

注意

警告 PHP は、int 型の値を内部的に格納する際に サイズがマシン依存の符号付き値 (C の long 型) を使うことに注意しましょう。int 型の範囲外の数値となる整数リテラルや演算結果は float として保持されます。この float 値を integer としてパックする際には まず最初に integer 型へのキャストを行います。 その結果、できあがるバイトパターンは期待通りにはならないかもしれません。 この問題にもっとも関連するのが、符号なしの数値で int 型で表現できるものをパックする場合です。 int 型のサイズが 32 ビットであるシステムでのキャスト結果は、 (実装で定義されている標準 C の符号なし型から符号付き型への変換に依存しますが) まるで int が符号なし整数であるかのような同一のバイトパターンになることがよくあります。 int 型のサイズが 64 ビットであるシステムでは、 たいていの場合は float の仮数部のサイズが足りず、 値の精度を損なわずに保持することができません。 ネイティブの 64 ビット C int 型を持つシステム (UNIX 系システムのほとんどは持っていません) では、上側の範囲の値で パック書式 I を使うための唯一の方法は、 希望する符号なし値と同じバイト表現になるような負の int 値を作ることになります。

更新履歴

バージョン 説明
7.2.0 float と double 型は、ビッグエンディアンとリトルエンディアンを両方サポートしました。
7.0.15,7.1.1 "e", "E", "g" および "G" コードが、float と double のバイトオーダーをサポートするために追加されました。
5.6.3 "q"、"Q"、"J"、"P" が追加され、64ビットの数値が使えるようになりました。
5.5.0 "Z" が追加されました。Perl の "a" と互換性のある機能です。

サンプル

例1 pack() の例

$binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);

この結果のバイナリ文字列の長さは 6 バイト長で、バイト列 0x12, 0x34, 0x78, 0x56, 0x41, 0x42となります。

参考

  • unpack() - バイナリ文字列からデータを切り出す
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール