コード例 #1
0
        public static IReadOnlyCollection <WeightedSymbol?> FlattenValues(this HuffmanTreeBase @this)
        {
            Guard.IsNotNull(@this, nameof(@this));
            TreeVisitor visitor = new TreeVisitor();

            @this.DoBFS(visitor);
            return(visitor.ValueList);
        }
コード例 #2
0
        public void BuildHuffmanTreeTest1()
        {
            HuffmanEncoder  encoder      = new HuffmanEncoder();
            WeightsTable    weightsTable = new WeightsTable();
            HuffmanTreeBase huffmanTree  = encoder.BuildHuffmanTree(weightsTable);

            Assert.IsNotNull(huffmanTree);
            CollectionAssert.IsEmpty(huffmanTree.FlattenValues());
        }
コード例 #3
0
        public void BuildHuffmanTreeTest4()
        {
            HuffmanEncoder encoder      = new HuffmanEncoder();
            WeightsTable   weightsTable = new WeightsTable();

            for (int n = 0; n < 13; n++)
            {
                weightsTable.TrackSymbol((byte)'A');
            }
            weightsTable.TrackSymbol((byte)'B');

            for (int n = 0; n < 2; n++)
            {
                weightsTable.TrackSymbol((byte)'C');
            }
            for (int n = 0; n < 15; n++)
            {
                weightsTable.TrackSymbol((byte)'D');
            }
            for (int n = 0; n < 11; n++)
            {
                weightsTable.TrackSymbol((byte)'E');
            }

            HuffmanTreeBase huffmanTree = encoder.BuildHuffmanTree(weightsTable);

            Assert.IsNotNull(huffmanTree);
            WeightedSymbol?[] expected =
            {
                new WeightedSymbol(0,         42),
                new WeightedSymbol((byte)'D', 15),
                new WeightedSymbol(0,         27),
                null,
                null,
                new WeightedSymbol((byte)'A', 13),
                new WeightedSymbol(0,         14),
                null,
                null,
                new WeightedSymbol(0,         03),
                new WeightedSymbol((byte)'E', 11),
                new WeightedSymbol((byte)'B', 01),
                new WeightedSymbol((byte)'C', 02),
                null,
                null,
                null,
                null,
                null,
                null,
            };
            Assert.AreEqual(expected, huffmanTree.FlattenValues());
        }
コード例 #4
0
        private byte[] Decode(byte[] code, HuffmanTreeBase tree, long streamSize)
        {
            MemoryStream             outputMemoryStream = new MemoryStream();
            FileDecodingInputStream  inputStream        = CreateFileDecodingInputStream(code);
            FileDecodingOutputStream outputStream       = CreateFileDecodingOutputStream(outputMemoryStream);

            try {
                new HuffmanDecoder().Decode(inputStream, tree, outputStream, streamSize, CancellationToken.None, null);
                return(outputMemoryStream.ToArray());
            }
            finally {
                inputStream.Dispose();
                outputStream.Dispose();
            }
        }
コード例 #5
0
        public void BuildHuffmanTreeTest2()
        {
            WeightsTable weightsTable = new WeightsTable();

            weightsTable.TrackSymbol(1);
            HuffmanEncoder encoder = new HuffmanEncoder();

            HuffmanTreeBase huffmanTree = encoder.BuildHuffmanTree(weightsTable);

            Assert.IsNotNull(huffmanTree);
            WeightedSymbol?[] expected =
            {
                new WeightedSymbol(1, 1), null, null
            };
            Assert.AreEqual(expected, huffmanTree.FlattenValues());
        }
コード例 #6
0
        private byte[] Encode(byte[] data, out HuffmanTreeBase tree, out long streamSize)
        {
            MemoryStream             outputMemoryStream = new MemoryStream();
            FileEncodingInputStream  inputStream        = CreateFileEncodingInputStream(data);
            FileEncodingOutputStream outputStream       = CreateFileEncodingOutputStream(outputMemoryStream);

            HuffmanEncoder encoder = new HuffmanEncoder();

            try {
                outputStream.BeginWrite();
                EncodingToken token = encoder.CreateEncodingToken(inputStream, CancellationToken.None);
                streamSize = encoder.Encode(inputStream, outputStream, token, CancellationToken.None, null);
                outputStream.EndWrite();
                tree = token.HuffmanTree;
                return(outputMemoryStream.ToArray());
            }
            finally {
                inputStream.Dispose();
                outputStream.Dispose();
            }
        }
コード例 #7
0
        public void BuildHuffmanTreeTest3()
        {
            HuffmanEncoder encoder      = new HuffmanEncoder();
            WeightsTable   weightsTable = new WeightsTable();

            for (int n = 0; n < 12; n++)
            {
                weightsTable.TrackSymbol((byte)'a');
            }
            for (int n = 0; n < 2; n++)
            {
                weightsTable.TrackSymbol((byte)'b');
            }
            for (int n = 0; n < 7; n++)
            {
                weightsTable.TrackSymbol((byte)'c');
            }
            for (int n = 0; n < 13; n++)
            {
                weightsTable.TrackSymbol((byte)'d');
            }
            for (int n = 0; n < 14; n++)
            {
                weightsTable.TrackSymbol((byte)'e');
            }
            for (int n = 0; n < 85; n++)
            {
                weightsTable.TrackSymbol((byte)'f');
            }

            HuffmanTreeBase huffmanTree = encoder.BuildHuffmanTree(weightsTable);

            Assert.IsNotNull(huffmanTree);
            WeightedSymbol?[] expected =
            {
                new WeightedSymbol(0,         133),
                new WeightedSymbol(0,         048),
                new WeightedSymbol((byte)'f', 085),
                new WeightedSymbol(0,         021),
                new WeightedSymbol(0,         027),
                null,
                null,
                new WeightedSymbol(0,         009),
                new WeightedSymbol((byte)'a', 012),
                new WeightedSymbol((byte)'d', 013),
                new WeightedSymbol((byte)'e', 014),
                new WeightedSymbol((byte)'b', 002),
                new WeightedSymbol((byte)'c', 007),
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
            };
            Assert.AreEqual(expected, huffmanTree.FlattenValues());
        }