/// <summary> /// read block of compressed data /// </summary> /// <param name="block">compressed data</param> /// <returns>true if success</returns> public bool ReadData(out Block block) { if (inputStream.BaseStream.Position != inputStream.BaseStream.Length) { try { block = BlockPool.GetBlock(); block.Number = inputStream.ReadInt32(); int blockSize = inputStream.ReadInt32(); block.Data = inputStream.ReadBytes(blockSize); //if (block.Data.Length != blockSize) throw new Exception("data block length doesn't match"); return(true); } catch (Exception e) { throw e; } } else { block = null; return(false); } }
/// <summary> /// write compressed data to stream /// </summary> /// <param name="data">compressed data</param> public void WriteData(Block data) { lock (locker) { outputStream.Write(data.Number); outputStream.Write(data.Data.Length); outputStream.Write(data.Data); } BlockPool.ReturnObject(data); }
/// <summary> /// read original data from input stream /// </summary> /// <param name="block">data converted to block</param> /// <returns>true if success</returns> public bool ReadData(out Block block) { if (inputStream.BaseStream.Position != inputStream.BaseStream.Length) { block = BlockPool.GetBlock(); block.Data = inputStream.ReadBytes(blockSize); block.Number = counter++; return(true); } else { block = null; return(false); } }
/// <summary> /// writing decompressed data to file /// </summary> /// <param name="data">decompressed data</param> public void WriteData(Block data) { lock (locker) { if (data.Number < position || dictToWrite.ContainsKey(data.Number)) { throw new Exception($"Duplicate key to write {data.Number}"); } dictToWrite.Add(data.Number, data.Data); while (dictToWrite.ContainsKey(position)) { outputStream.Write(dictToWrite[position]); dictToWrite.Remove(position++); } BlockPool.ReturnObject(data); } }