PHPでsubstrをファイルポインタ操作に対応させるとこうなる

ここの PNG_Reader を ファイルポインタ 使わずに実装する必要があったので,ファイルポインタを使って実装したコードを substr で実装してみた例です.
※PNG_URI(PNG画像のURI)とCHUNK_HEADER_SIZE(最初のチャンクのサイズ)はどこかで定義されているものとみなしてください.

ファイルポインタを使ったコード

<?php
//バイナリとテキストファイルの形式が異なるシステム
//(すなわちWindowsだとか)で処理する場合は b も指定する必要があるらしい
$f = fopen(PNG_URI, 'rb');
// 現在のファイルポインタの位置から8バイト読み込む
$header = fread($f, 8);
$chunkHeader = fread($f, 8);
// 現在のファイルポインタの位置を出力
echo ftell($f);   // 16
// ファイルポインタの位置をCHUNK_HEADER_SIZE + 4だけ進める
fseek($f, CHUNK_HEADER_SIZE + 4, SEEK_CUR);
$nextChunkHeader = fread($f, 8);
?>

substrを使ったコード

<?php
$binary = file_get_contents(PNG_URI);
$offset = 0;  // ファイルポインタの位置に相当
// $offset の位置から8バイト抽出(読み込む)
$header = substr($binary, $offset, 8);
$offset += 8;
$chunkHeader = substr($binary, $offset, 8);
$offset += 8;
echo $offset;   // 16
$offset += CHUNK_HEADER_SIZE + 4;
$nextChunkHeader = substr($binary, $offset, 8);
$offset += 8;
?>

そのまんまですね…