バイナリ データの処理

バイナリへの変換

string pack (
    string $format
    [, mixed $args
    [, mixed $...
    ]] )
PHP: pack - Manual

変換方法は$formatで指定します。その書式は下記のフォーマット文字列に従います。

フォーマット文字列
コード 説明 ビット数 バイトオーダー
a NUL で埋めた文字列    
A 空白で埋めた文字列    
h 十六進文字列、下位ニブルが先    
H 十六進文字列、上位ニブルが先    
c signed char 8  
C unsigned char 8  
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 リトルエンディアン
f float マシン依存 マシン依存
d double マシン依存 マシン依存
x NUL バイト    
X 1 バイト戻る    
Z NUL 埋め文字列 (PHP 5.5 以降)    
@ 絶対位置まで NUL で埋める    
PHP: pack - Manual
echo chr( 65 );       // Aと出力
echo pack( 'C', 65 ); // A

変換結果の確認

pack()により実際にどのようなデータに変換されたかは、bin2hex()で16進表記にして確認できます。

$binarydata = pack( "nvc*", 0x1234, 0x5678, 65, 66 );
echo bin2hex( $binarydata ); // 123478564142と出力

bin2hex()

バイナリのデータを、16進表記の文字列に変換できます。

string bin2hex ( string $str )
PHP: bin2hex - Manual
echo bin2hex( 'ABC' ); // 414243 ('A','B,'C'のASCIIコードの16進表記)

この関数の処理は、ord()とdechex()でも実現できます。

function binTohex( $str )
{
    $result = array();
    for( $i = 0; $i < strlen( $str ); $i++ )
    {
        $result[] = dechex( ord( $str[ $i ] ) );
    }

    return implode( $result );
}

バイナリからの変換

array unpack (
    string $format ,
    string $data
    )
PHP: unpack - Manual

変換例

GIFファイルを解析する場合を考えます。ファイルの先頭から、

47 49 46 38 39 61 78 00 5A 00

のようにデータが格納されているとすると、

$fp = fopen( 'sample.gif', 'rb' );
$data = fread( $fp, 10 );

$format = 'a3signature/a3version/vwidth/vheight';
$info = unpack( $format, $data );

このときunpack()が返す配列には、次のようにデータが格納されます。

Array
(
    [signature] => GIF  // 47 49 46
    [version] => 89a    // 38 39 61
    [width] => 120      // 78 00 (0x0078 = 120)
    [height] => 90      // 5A 00 (0x005A = 90)
)
GIFフォーマットの詳細
PHPのマニュアルから検索