2016-11-20 3 views
0

Comment connaître la taille de mon fichier compressé utilisé GzipStream? Je sais qu'il a un en-tête et un suffixe. 10 premiers octets - c'est l'en-tête, deuxième 8 octets - suffixe. Comment puis-je connaître le fichier de taille dans le suffixe?En-tête et suffixe Gzipstream

Répondre

-1

Les quatre derniers octets du fichier contiennent la taille du fichier non compressé.

Selon this post, le code suivant vous donnera la taille du fichier:

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 contiendra la taille du fichier. Editer: Appologies, J'ai remarqué que vous avez tagué votre message avec C#, mais le code ci-dessus est pour Java, bien que ce qui précède va certainement vous mettre sur la bonne voie.

Bonne chance.

---- ---- EDIT

Comme par commentaire de @gusman, j'édite ce commentaire que le vote vers le bas peut être retiré. Veuillez voir my other answer below pour mon exemple de code alternatif.

+0

S'il vous plaît expliquer la note marquée? Merci – WizzKidd

+0

C'est Java, pas C#. Dans certains cas, C# et Java peuvent être très similaires et acceptables pour répondre à Java avec C# ou C# avec Java, mais dans ce cas, le code est complètement différent. – Gusman

+1

Si vous modifiez votre réponse et placez l'autre réponse dans ce que je vais supprimer le vote négatif, je ne peux pas supprimer sauf si vous modifiez la réponse, S.O. ne le permet pas. – Gusman

0

Je vois que vous avez voté ma réponse précédente très probablement parce que c'était un exemple en utilisant Java. Le principe est toujours le même, donc la réponse à votre question serait que les 4 derniers octets contiennent les informations dont vous avez besoin. Espérons que cette réponse est plus ce que vous recherchez.

Voici un exemple de fonction C# Decompress décomprimer le GZip y compris d'obtenir la taille du fichier compressé utilisé par GZipStream:

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

Quelque chose un peu mieux écrit:

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