Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
 public void WriteBits(SymbolCode code)
 {
     WriteBits(code.Bits, code.Length);
 }