ホームページ  >  記事  >  バックエンド開発  >  PHPでバイナリファイルを読み取る方法

PHPでバイナリファイルを読み取る方法

WBOY
WBOYオリジナル
2016-06-23 13:11:422858ブラウズ

多くの場合、データはテキスト形式で保存されないため、バイナリ データを読み取って必要な形式に復元する必要があります。 PHP はバイナリ処理の強力なサポートも提供します。

タスク

以下では、PHP を使用してバイナリ ファイルを読み取り、分析する方法を説明するための例として、PNG 画像のファイル ヘッダーを読み取り、分析します。

関連関数

• fopen

• fread

• unpack

• bin2hex

PNG 形式の紹介

タスクを完了するために、ここで PNG ファイル形式について簡単に紹介します。 ... コピー: 89 50 4e 47 0d 0a 1a 0a

私たちのタスクは、このファイルヘッダーを読み取ることです。

PNG 形式の詳細な紹介:

http://www.w3.org/TR/2003/REC-PNG-20031110/

http://www.libpng.org/pub/png/

読むfiles

PHP コード

$filePath = "icon.png" ;

// ファイルの読み取りには rb を使用する必要があり、これによりクロスプラットフォームのバイナリ データの読み取りの安全性が保証されます

$fh = fopen ( $filePath , "rb" );
  1. //最初の 8 バイトのみを読み取ります
  2. $head = fread ( $fh , 8);
  3. 上記のコードは次のようになります。可変ヘッドに読み込まれます。 head はバイナリ データを格納する配列であり、必要なデータを取得するためにいくつかの操作を行う必要があります。
  4. unpack
  5. unpack は、バイナリ データをリレーショナル配列に解析できます。最初のパラメータは解析メソッド文字列 (以下を参照) を提供し、2 番目のパラメータは前に読み取った head 変数を提供します。
• a: NULL で埋められたバイト文字列

• A: スペースで埋められたバイト文字列

• h: 16 進数、下位ニブルが最初

• H: 16 進数、上位ニブルが最初

• c: 符号付き文字

• C: 符号なし文字

• s: 符号付き short (常に 16 ビット、マシンバイトオーダー)

• S: unsigned short (常に 16 ビット、マシンバイトオーダー)

• n: unsigned short (常に 16 ビット、ビッグエンディアン)

• v: 符号なし short (常に 16 ビット、リトルエンディアン)

• I: 符号付き整数 (マシンに依存するサイズとエンディアン)

• I: 符号なし整数 (マシンに依存するサイズとエンディアン)

• l: signed Long (常に 32 ビット、マシンバイトオーダー)

• L: Unsigned Long (常に 32 ビット、マシンバイトオーダー)

• N: Unsigned Long (常に 32 ビット、ビッグエンディアン)

• V : unsigned long (常に 32 ビット、リトル エンディアン)

• f: 浮動小数点 (マシンに依存するサイズと表現)

• d: double (マシンに依存するサイズと表現)

• x: null バイト

• 、以下は例です:

• C は 1 文字を読み取り、返される配列インデックスは 1 です

• C4 は 4 バイトを読み取り、各バイトは 1 文字で、返される配列インデックスは 1、2、3、4 です

• C4head は 4 文字を読み取り、バイトごとに 1 文字、返される配列インデックスは head1、head2、head3、head4 です

• Chead は 1 文字を読み取り、返される配列インデックスは head

今すぐ試してください 最初のバイトを読み取ります:

PHP コード

$arr = unpack( "Chead" , $head );

//Array ( [head] => 137 )

8 バイトすべてを読み取るスラッシュで区切ります:

PHP コード

  1. $arr = unpack( "Chead/C3string/C4number" , $head );
  2. の先頭にキーを入力します。文字列を文字列に変換:

PHP コード

$arr = unpack( "Chead/C3string/C4number" , $head );

    for ( $ i =1; $i {
  1. $type .= chr ( $arr [ 'string' . $i ])
  2. }
echo $type ; print_rで印刷した内容上記はすべて 10 進数です。16 進数の値を直接取得したい場合は、bin2hex 関数を使用できます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。