public static IReadOnlyCollection <WeightedSymbol?> FlattenValues(this HuffmanTreeBase @this) { Guard.IsNotNull(@this, nameof(@this)); TreeVisitor visitor = new TreeVisitor(); @this.DoBFS(visitor); return(visitor.ValueList); }
public void BuildHuffmanTreeTest1() { HuffmanEncoder encoder = new HuffmanEncoder(); WeightsTable weightsTable = new WeightsTable(); HuffmanTreeBase huffmanTree = encoder.BuildHuffmanTree(weightsTable); Assert.IsNotNull(huffmanTree); CollectionAssert.IsEmpty(huffmanTree.FlattenValues()); }
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()); }
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(); } }
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()); }
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(); } }
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()); }