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フォーマットの詳細