byte[] がGzipStream
.net クラスによって圧縮されている (または圧縮されていない) かどうかを知る方法はありますか?
編集: byte[] 配列が圧縮されているかどうかを知りたいだけです (圧縮と解凍には常に GzipStream を使用するため)
byte[] がGzipStream
.net クラスによって圧縮されている (または圧縮されていない) かどうかを知る方法はありますか?
編集: byte[] 配列が圧縮されているかどうかを知りたいだけです (圧縮と解凍には常に GzipStream を使用するため)
GZipStreamは、ヘッダーとトレーラーが追加されたDeflateStreamです。
形式はRFC 1952で指定されています。
.NET 4.0 GZipStreamクラスは、次のバイトをヘッダーとして書き込みます。
byte[] headerBytes = new byte[] { 0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0 };
if (compressionLevel == 10)
{
headerBytes[8] = 2;
}
トレーラは、CRC32チェックサムと非圧縮データの長さで構成されます。
@dtdの説明のおかげで、これは私にとってはうまくいきます:(@stackoverflowuser、これが欲しいかもしれません?)
public static class CompressionHelper
{
public static byte[] GZipHeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0};
public static byte[] GZipLevel10HeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 2, 0};
public static bool IsPossiblyGZippedBytes(this byte[] a)
{
var yes = a.Length > 10;
if (!yes)
{
return false;
}
var header = a.SubArray(0, 10);
return header.SequenceEqual(GZipHeaderBytes) || header.SequenceEqual(GZipLevel10HeaderBytes);
}
}
マジック ヘッダーの最初の数バイトを調べて、gzip 圧縮されているかどうかを確認できますが、.net 圧縮プログラムがコメントまたはその他のオプション フィールドのいずれかに追加情報を書き込まない限り、圧縮プログラムが誰であるかはおそらくわかりません。
http://www.onicos.com/staff/iz/formats/gzip.html
OS タイプ フィールドを調べて、それが FAT か NTFS かを確認することもできますが、それでも C# によって記述されたものかどうかはわかりません...