Perché gzip / deflate comprime un file di piccole dimensioni con molti zeri finali?

Sto usando il seguente codice per comprimere un piccolo file HTML (~ 4kB) in C #.

byte[] fileBuffer = ReadFully(inFile, ResponsePacket.maxResponsePayloadLength); // Read the entire requested HTML file into a memory buffer inFile.Close(); // Close the requested HTML file byte[] payload; using (MemoryStream compMS = new MemoryStream()) // Create a new memory stream to hold the compressed HTML data { using (GZipStream gzip = new GZipStream(compMS, CompressionMode.Compress)) // Create a new GZip object pointing to the empty memory stream { gzip.Write(fileBuffer, 0, fileBuffer.Length); // Compress the file buffer and write it to the empty memory stream gzip.Close(); // Close the GZip object } payload = compMS.GetBuffer(); // Write the compressed file buffer data in the memory stream to a byte buffer } 

I dati compressi risultanti sono circa 2k, ma circa la metà di esso è solo zero. Questo è per un’applicazione sensibile alla larghezza di banda (che è il motivo per cui mi sto preoccupando di comprimere 4kB in primo luogo), quindi il 1kB in più di zeri è sprecato spazio prezioso. La mia ipotesi migliore sarebbe che l’algoritmo di compressione stia espandendo i dati a un limite di blocco. In tal caso, esiste un modo per ignorare questo comportamento o modificare la dimensione del blocco? Ottengo gli stessi risultati con vanilla .NET GZipStream e GZipStream di zlib, oltre a DeflateStream.

Metodo MemoryStream errato. GetBuffer () restituisce il buffer sottostante, è sempre più grande (o esattamente grande) dei dati nel stream. Molto efficiente perché non è necessario eseguire alcuna copia.

Ma qui hai bisogno del metodo ToArray (). O utilizzare la proprietà Length.