PHPである変数に入ってるデータが、deflateやbz2で圧縮されたものか、そうでないものか、データ内容だけで判別する方法を教えて下さい。


※具体的な例を書いて頂けると有り難いです。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2014/10/02 08:25:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:iww No.1

回答回数101ベストアンサー獲得回数10

ポイント100pt

ヘッダ部分を比較するといけます

bzip2のヘッダ
先頭10バイトが 文字列BZhと圧縮率、マジックナンバー6バイト(0x314159265359) の場合、bzip2です

gzipのヘッダ
先頭3バイトが0x1F,0x8B,0x08の場合、gzip(deflate)です

#!/usr/bin/php -q
<?
    $buf = fread( STDIN, 10 ) or die("fread");
//  print( "$buf\n" );

    // bzip2判定
    if( preg_match( "/BZh(\d)1AY&SY/", $buf, $m ) ){
        print("bzip2 ". $m[1] ."\n");
    }

    // gzip判定
    for($i=0;$i<10;$i++){ $a[$i] = ord(substr($buf,$i,1)); }
    if( $a[0]==0x1F && $a[1]==0x8B && $a[2]==0x08 ){
        print("gzip\n");
    }
?>

プログラムで書くとこんな感じです

id:wankodon

たいへん遅くなりましたが、回答どうもありがとうございました。
意外と簡単に実装できそうですね。参考にさせて頂きます!

2014/10/02 08:24:57
  • id:psne
    例えば、圧縮されたファイルのデータが入っている場合、先頭5~20byte程度にヘッダー情報(マジックナンバー)が入っている事が多いため、その情報を調べる事によって圧縮されているかを調べる事が出来ます。
    例:bz2 → BZh91AY&SY …
  • id:a-kuma3
    http://ideone.com/Y2mhJG
    gzdeflate 関数で圧縮すると、gzip ヘッダが付かない。
    gzencode 関数だと、付くけど。

    ファイルに落ちてるデータだったら、こっち?
    http://php.net/manual/ja/function.finfo-open.php
  • id:iww
    今時はfinfoなんてあるんですね
    じゃあもうこれこっち使うべきですね
  • id:a-kuma3
    どこまで正確に判断できるかは、magic ファイル依存なのですが、php では、独自に持っているようなので、どこまで正確なのだ(というか、どこまでサポートされているのだ)ろうか、と。

    因みに、ぼくは PHP'er ではないので、ドキュメントなどで記載されている範囲でしか、よく分かりません。
  • id:wankodon
    遅くなりましたが、皆様コメントありがとうございました。
    こちらも有り難く参考にさせて頂きます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません