Exemple #1
0
        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);
        }