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 で埋める |
echo chr( 65 ); // Aと出力 echo pack( 'C', 65 ); // A
pack()により実際にどのようなデータに変換されたかは、bin2hex()で16進表記にして確認できます。
$binarydata = pack( "nvc*", 0x1234, 0x5678, 65, 66 );
echo bin2hex( $binarydata ); // 123478564142と出力
バイナリのデータを、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フォーマットの詳細