コード例 #1
0
        //re-compress node
        public override void Encode(BinaryWriter writer)
        {
            // encode the node into bytes
            byte[]       data;
            MemoryStream uncompressedStream = new MemoryStream();

            using (BinaryWriter w = new BinaryWriter(uncompressedStream)) {
                // use the node's own codec or we'll mess up the string lists
                Decoded.Codec.EncodeRootNode(w, Decoded);
                data = uncompressedStream.ToArray();
            }
            uint uncompressedSize = (uint)data.LongLength;

            // compress the encoded data
#if DEBUG
            Console.WriteLine("compressing...");
#endif
            MemoryStream outStream = new MemoryStream();
            LzmaEncoder  encoder   = new LzmaEncoder();
            using (uncompressedStream = new MemoryStream(data)) {
                encoder.Code(uncompressedStream, outStream, data.Length, long.MaxValue, null);
                data = outStream.ToArray();
            }
#if DEBUG
            Console.WriteLine("ok, compression done");
#endif

            // prepare decoding information
            List <EsfNode> infoItems = new List <EsfNode>();
            infoItems.Add(new UIntNode {
                Value = uncompressedSize, TypeCode = EsfType.UINT32, Codec = Codec
            });
            using (MemoryStream propertyStream = new MemoryStream()) {
                encoder.WriteCoderProperties(propertyStream);
                infoItems.Add(new RawDataNode(Codec)
                {
                    Value = propertyStream.ToArray()
                });
            }
            // put together the items expected by the unzipper
            List <EsfNode> dataItems = new List <EsfNode>();
            dataItems.Add(new RawDataNode(Codec)
            {
                Value = data
            });
            dataItems.Add(new RecordNode(Codec)
            {
                Name = CompressedNode.INFO_TAG, Value = infoItems
            });
            RecordNode compressedNode = new RecordNode(Codec)
            {
                Name = CompressedNode.TAG_NAME, Value = dataItems
            };

            // and finally encode
            compressedNode.Encode(writer);
        }
コード例 #2
0
        protected virtual void WriteRecordNode(BinaryWriter writer, EsfNode node)
        {
            RecordNode recordNode = node as RecordNode;

            recordNode.Encode(writer);
        }