Gzip圧縮されているかどうかにかかわらず、ファイルを読み取る必要があるC/C++プログラムがあります。 zlibのgzread()を使用して、圧縮ファイルと非圧縮ファイルの両方を読み取ることができることはわかっていますが、zlib関数は、(パフォーマンス上の理由から)ファイルがgzip圧縮されている場合にのみ使用します。
それで、特定のファイルがC/C++からgzip圧縮されているかどうかをプログラムで検出または確認する方法はありますか?
ファイルの先頭にマジックナンバーがあります。最初の2バイトを読み取って、それらが0x1f8b
に等しいかどうかを確認するだけです。
偽陽性、偽陰性、または偽の結果をまったく好まない(パフォーマンスが低下する...)か。
RFC 1952:GZIPファイル形式仕様バージョン4. は、ファイルの最初の2バイト(各メンバーのしたがって)が'\x1F'
および'\x8B'
。これを、誤検知の原因となる可能性がある最初のチェックに使用します。
Gzread()を使用した圧縮ファイルと非圧縮ファイルの読み取りのパフォーマンスの違いは何ですか?
とにかく、ファイルがgzipされているかどうかを検出するために、リンクに従って1f 8b
であるファイルの先頭にある マジックナンバー を読み取ることができます。
RFC 1951および 1952 に記述されている署名をテストして、アイデアを得ることができます。 GZIPファイルの場合、2番目のファイルが関連し、決定的です。他の形式ではいくつかの誤検知があるため、ヘッダーのもっともらしい値を確認する必要があります。
Zlibストリームだけでは、誤検知が発生しやすくなるため、多少難しくなります。しかし、自分で野生の人に出会うことはめったにありません。