private SymbolCode[] GetCodes(HuffmanNode root, HuffmanNode[] symbols) { var codes = new SymbolCode[256]; if (symbols.Length == 1) { var symbol = symbols[0]; codes[symbol.Symbol] = new SymbolCode { Bits = 0, Length = 1 }; } else { foreach (var symbol in symbols) { var current = symbol; var code = new SymbolCode(); while (current != root) { code.SetBit(current.Bit); current = current.Parent; } codes[symbol.Symbol] = code; } } return(codes); }
public Archive ReadArchiveInfo(Stream input) { using (var br = new BinaryReader(input, new UTF8Encoding(), true)) { int filesCount = br.ReadInt32(); var archive = new Archive(); for (int i = 0; i < filesCount; i++) { var name = br.ReadString(); var originalSize = br.ReadInt64(); var bitsLength = br.ReadInt64(); var offset = br.ReadInt64(); var codesCount = br.ReadInt16(); var codes = new SymbolCode[256]; for (int j = 0; j < codesCount; j++) { var symbol = br.ReadByte(); var bits = br.ReadUInt32(); var length = br.ReadByte(); codes[symbol] = new SymbolCode { Bits = bits, Length = length }; } archive.Add(new ArchivedFile(name, originalSize, bitsLength, offset, codes)); } return(archive); } }
public void WriteBits(SymbolCode code) { WriteBits(code.Bits, code.Length); }