unpack

(PHP 4, PHP 5, PHP 7, PHP 8)

unpackバイナリ文字列からデータを切り出す

説明

unpack(string $format, string $string, int $offset = 0): array|false

format に基づき、バイナリ文字列から配列に分解します。

分解した結果は連想配列に格納されます。 このようにするには、別のフォーマットコードを使用してそれらを スラッシュ / で区切る必要があります。 引数にリピータが含まれる場合の配列の要素名は、 指定した名前の後に順番に番号がついたものとなります。

Perl の関数に動きを近づけるために、以下の変更が行われています:

  • "a" は最後の NULL バイトを維持します。
  • "A" は最後の ASCII 空白文字 (スペース、タブ、改行、キャリッジリターン、 NULL バイト) をすべて取り除きます。
  • NULL 埋め文字列用に "Z" が追加されました。 これは最後の NULL バイトを取り除きます。

パラメータ

format

書式コードの説明は pack() を参照ください。

string

パックされたデータ。

offset

データ切り出しを開始するオフセット。

戻り値

バイナリ文字列を切り出した要素を含む連想配列を返します。失敗した場合に false を返します

変更履歴

バージョン 説明
7.2.0 float および double 型は、 ビッグエンディアンとリトルエンディアンの両方をサポートします。
7.1.0 オプションの offset が追加されました。

例1 unpack() の例

<?php
$binarydata
= "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
?>

上の例の出力は以下となります。

Array
(
    [chars] => 4
    [int] => 160
)

例2 unpack() でのリピータの例

<?php
$binarydata
= "\x04\x00\xa0\x00";
$array = unpack("c2chars/nint", $binarydata);
print_r($array);
?>

上の例の出力は以下となります。

Array
(
    [chars1] => 4
    [chars2] => 0
    [int] => 40960
)

注意

警告

PHP は内部的に整数を符号付きで保持することに注意しましょう。 大きな値の unsigned long を切り出した場合、PHP の内部で保持された値は、 同じ大きさの符号付き整数となり、符号無しを指定して切出された場合でも 結果は負の数となります。

警告

要素に名前をつけなければ、1 から始まる数値インデックスを用います。 名前をつけない要素が複数ある場合は、データが上書きされてしまうかもしれないことに注意しましょう。 それぞれの要素について、数値インデックスが 1 から割りあてられるからです。

例3 unpack() で名前のないキーを扱う例

<?php
$binarydata
= "\x32\x42\x00\xa0";
$array = unpack("c2/n", $binarydata);
var_dump($array);
?>

上の例の出力は以下となります。

array(2) {
  [1]=>
  int(160)
  [2]=>
  int(66)
}

c で指定した最初の値が n で指定した値で上書きされることに注意しましょう。

参考

  • pack() - データをバイナリ文字列にパックする