public byte[] SaveToUncompressed() { byte[] uncompressedData; using (var stream = new MemoryStream()) { foreach (var node in Nodes) { var parser = _parsers.Where(p => p.ParsableNodeName == node.Name).FirstOrDefault(); if (parser != null) { stream.Write(parser.Write(node, _parsers)); } else { var fallback = new DefaultParser(); stream.Write(fallback.Write(node, _parsers)); } } uncompressedData = stream.ToArray(); } RecalculateOffsets(); var footerWithoutLast8Bytes = BuildFooterWithoutLastEightBytes(); var compressor = new SaveFileCompressionHelper(); var chunks = compressor.CompressToChunkList(uncompressedData); foreach (var chunk in chunks) { chunk.CompressedChunkSize = 4 << 16; chunk.DecompressedChunkSize = 4 << 16; chunk.CompressedData = new byte[4 << 16]; chunk.DecompressedData = new byte[0]; } var offset = (chunks.Count - 1) * 4; chunks.Last().DecompressedChunkSize = uncompressedData.Length - (offset << 16); chunks.Last().CompressedData = new byte[uncompressedData.Length - (offset << 16)]; var header = BuildHeader(chunks); //var header = BuildHeader(new List<Lz4Chunk>()); byte[] result; using (var stream = new MemoryStream()) { using (var writer = new BinaryWriter(stream, Encoding.ASCII)) { writer.Write(header); writer.Write(uncompressedData); int lastBlockOffset = (int)writer.BaseStream.Position; writer.Write(footerWithoutLast8Bytes); writer.Write(lastBlockOffset); writer.Write(Encoding.ASCII.GetBytes(Constants.Magic.END_OF_FILE)); } result = stream.ToArray(); } return(result); }