2016-11-20 6 views
0

GzipStreamで使用している圧縮ファイルのサイズを知る方法を教えてください。私はそれがヘッダーとサフィックスを持っていることを知っています。最初の10バイト - ヘッダー、2番目の8バイト - 接尾辞。サフィックスのサイズファイルを知るにはどうすればよいですか?Gzipstreamヘッダーとサフィックス

答えて

-1

ファイルの最後の4バイトには、圧縮されていないファイルサイズが含まれています。

this postによると、次のコードは、あなたのファイルのサイズを与える:

RandomAccessFile raf = new RandomAccessFile(yourGzipFile, "r"); 
raf.seek(raf.length() - 4); 
int b4 = raf.read(); 
int b3 = raf.read(); 
int b2 = raf.read(); 
int b1 = raf.read(); 
int filesize = (b1 << 24) | (b2 << 16) + (b3 << 8) + b4; 
raf.close(); 

filesizeは、ファイルサイズが含まれます。

編集:アプリケーション、私は上記のコードはJavaのためのものですが、上記のコードは間違いなく正しいパスに入れられますが、C#であなたの投稿をタグ付けしたことに気付きました。

幸運。

---- EDIT ----

@gusmanによって行われたコメントを1としてダウン票を除去することができるように、私はこのコメントを編集しています。代わりのコード例はmy other answer belowを参照してください。

+0

説明してくださいグレードをマーク?ありがとう – WizzKidd

+0

それはC#ではなくJavaです。いくつかのケースでは、C#とJavaは非常によく似ていて、javaの場合はC#またはC#の場合はJavaで答えることができますが、この場合のコードはまったく異なります。 – Gusman

+1

あなたがあなたの答えを編集してこれに他の回答を入れると、私は否定的な投票を削除します。答えを変更しない限り、私は削除できません。それを許さない。 – Gusman

0

Javaを使用しているため、私の以前の回答は投票した可能性が高いと思います。原則はまだ同じです。あなたの質問に対する答えは、最後の4バイトに必要な情報が含まれているということです。うまくいけば、この答えは、あなたが何をしているかです。ここで

GZipStreamで使用される圧縮ファイルのサイズを取得するにGZipを含めて解凍のC#Decompress関数の例である:

static public byte[] Decompress(byte[] b) 
{ 
    MemoryStream ms = new MemoryStream(b.length); 
    ms.Write(b, 0, b.Length); 
    //last 4 bytes of GZipStream = length of decompressed data 
    ms.Seek(-4, SeekOrigin.Current); 
    byte[] lb = new byte[4]; 
    ms.Read(lb, 0, 4); 
    int len = BitConverter.ToInt32(lb, 0); 
    ms.Seek(0, SeekOrigin.Begin); 
    byte[] ob = new byte[len]; 
    GZipStream zs = new GZipStream(ms, CompressionMode.Decompress); 
    zs.Read(ob, 0, len); 
    returen ob; 
} 
0

少し良く書かれた何か:

public int GetUncompressedSize(string FileName) 
{ 
    using(BinaryReader br = new BinaryReader(File.OpenRead(pathToFile)) 
    { 
     br.BaseStream.Seek(SeekOrigin.End, -4); 
     return br.ReadInt32(); 
    } 
}