private void DecompressWork() { byte[] buffer; int chunkIndex = 0; int readLength = 0; while (!_StopWork && (readLength = _ChunkReader.ReadChunk(out buffer, out chunkIndex)) > 0) { byte[] decompressed = null; using (MemoryStream ws = new MemoryStream()) { using (MemoryStream ms = new MemoryStream(buffer)) using (GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress)) gzip.CopyTo(ws); decompressed = ws.ToArray(); } _ChunkWriter.WriteChunk(decompressed, 0, decompressed.Length, chunkIndex); } }
private void CompressWork() { int chunkIndex = 0; byte[] buffer; int readLength = 0; while (!_StopWork && (readLength = _ChunkReader.ReadChunk(out buffer, out chunkIndex)) > 0) { byte[] compressed = null; using (MemoryStream ms = new MemoryStream()) { using (GZipStream gzip = new GZipStream(ms, CompressionMode.Compress)) { gzip.Write(buffer, 0, readLength); } compressed = ms.ToArray(); } _ChunkWriter.WriteChunk(compressed, 0, compressed.Length, chunkIndex); } }
public void ReadChunk(IChunkReader reader) { byte[] idBytes = ReadByteArray(4); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { char c = (char)idBytes[i]; if (c >= 'A' && c <= 'Z') { sb.Append(c); } else { throw new Exception("Chunk id contained unexpected letter"); } } string id = sb.ToString(); //System.Console.WriteLine("Reading " + id); long chunkLength = ReadLong(); long chunkStart = stream.Position; currentChunkStart = chunkStart; currentChunkLength = chunkLength; reader.ReadChunk(id, chunkLength, this); long bytesReadByReader = stream.Position - chunkStart; if (bytesReadByReader > chunkLength) { throw new Exception("Chunk reader read past the end of chunk '" + id + "'"); } //System.Console.WriteLine("Skipping " + (chunkLength - bytesReadByReader)); // Skip the rest of the chunk stream.Seek(chunkLength - bytesReadByReader, SeekOrigin.Current); }