public byte[] Decode(Stream stream) { using (var ms = new MemoryStream()) { var br = new BitReader(stream); int value; int i = 0; int prevValue = -1; byte lastChar = 0; if (br.BitsRead + lookup.CodeLen <= br.BitsLength) { value = br.ReadBits(lookup.CodeLen); lastChar = lookup.OutputText(lastChar, value, ms); prevValue = value; } while (br.BitsRead < br.BitsLength) { if (lookup.Count >= 0xFFF) { lookup.Reset(); if (br.BitsRead + lookup.CodeLen <= br.BitsLength) { value = br.ReadBits(lookup.CodeLen); lastChar = lookup.OutputText(lastChar, value, ms); prevValue = value; } } if (br.BitsRead + lookup.CodeLen <= br.BitsLength) { lookup.EnsureCodeLen(); value = br.ReadBits(lookup.CodeLen); } else { break; } if (value != lookup.Count) { lastChar = lookup.OutputText(lastChar, value, ms); lookup.AppendChar(lastChar, prevValue); } else { lookup.AppendChar(lastChar, prevValue); lastChar = lookup.OutputText(lastChar, value, ms); } prevValue = value; } return(ms.ToArray()); } }
public byte[] Encode(byte[] input) { var buffer = new byte[0xffff]; var bufferIdx = 0; using (var ms = new MemoryStream()) { using (var bw = new BitWriter(ms)) { int i = 0; string w = ""; while (i < input.Length) { bufferIdx = 0; buffer[bufferIdx++] = input[i++]; int cur = -1, prev = -1; while ((cur = lookup.FindEntry(buffer, 0, bufferIdx)) != -1 && i < input.Length) { buffer[bufferIdx++] = input[i++]; prev = cur; } if (cur == -1) { //Debug.WriteLine("E: " + prev); bw.WriteBits((uint)prev, (uint)lookup.CodeLen); lookup.AppendChar(buffer[bufferIdx - 1], prev); i--; } else { //Debug.WriteLine("E: " + cur); bw.WriteBits((uint)cur, (uint)lookup.CodeLen); } lookup.EnsureCodeLen2(); if (lookup.Count > 0xFFF) { lookup.Reset(); } } } return(ms.ToArray()); } }