private static string _decompress(int length, int resetValue, GetNextValue getNextValue) { var dictionary = new Dictionary <int, string>(); int next, enlargeIn = 4, dictSize = 4, numBits = 3, i, resb; var c = 0; var result = new StringBuilder(); var data = new DataStruct() { Val = getNextValue(0), Position = resetValue, Index = 1 }; for (i = 0; i < 3; i++) { dictionary[i] = Convert.ToChar(i).ToString(); } var bits = 0; var maxpower = (int)Math.Pow(2, 2); var power = 1; while (power != maxpower) { resb = data.Val & data.Position; data.Position >>= 1; if (data.Position == 0) { data.Position = resetValue; data.Val = getNextValue(data.Index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } switch (next = bits) { case 0: bits = 0; maxpower = (int)Math.Pow(2, 8); power = 1; while (power != maxpower) { resb = data.Val & data.Position; data.Position >>= 1; if (data.Position == 0) { data.Position = resetValue; data.Val = getNextValue(data.Index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } c = Convert.ToInt32(F(bits)); break; case 1: bits = 0; maxpower = (int)Math.Pow(2, 16); power = 1; while (power != maxpower) { resb = data.Val & data.Position; data.Position >>= 1; if (data.Position == 0) { data.Position = resetValue; data.Val = getNextValue(data.Index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } c = Convert.ToInt32(F(bits)); break; case 2: return(""); } dictionary[3] = Convert.ToChar(c).ToString(); var w = Convert.ToChar(c).ToString(); result.Append(Convert.ToChar(c)); while (true) { if (data.Index > length) { return(""); } bits = 0; maxpower = (int)Math.Pow(2, numBits); power = 1; while (power != maxpower) { resb = data.Val & data.Position; data.Position >>= 1; if (data.Position == 0) { data.Position = resetValue; data.Val = getNextValue(data.Index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } switch (c = bits) { case 0: bits = 0; maxpower = (int)Math.Pow(2, 8); power = 1; while (power != maxpower) { resb = data.Val & data.Position; data.Position >>= 1; if (data.Position == 0) { data.Position = resetValue; data.Val = getNextValue(data.Index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = F(bits).ToString(); c = dictSize - 1; enlargeIn--; break; case 1: bits = 0; maxpower = (int)Math.Pow(2, 16); power = 1; while (power != maxpower) { resb = data.Val & data.Position; data.Position >>= 1; if (data.Position == 0) { data.Position = resetValue; data.Val = getNextValue(data.Index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = F(bits).ToString(); c = dictSize - 1; enlargeIn--; break; case 2: return(result.ToString()); } if (enlargeIn == 0) { enlargeIn = (int)Math.Pow(2, numBits); numBits++; } var entry = ""; if (dictionary.ContainsKey(c)) { entry = dictionary[c]; } else { if (c == dictSize) { entry = w + w[0]; } else { return(null); } } result.Append(entry); //Add w+entry[0] to the dictionary. dictionary[dictSize++] = w + entry[0]; enlargeIn--; w = entry; if (enlargeIn != 0) { continue; } enlargeIn = (int)Math.Pow(2, numBits); numBits++; } }
private static string _decompress(int length, int resetValue, GetNextValue getNextValue) { Dictionary<int, string> dictionary = new Dictionary<int, string>(); int next, enlargeIn = 4, dictSize = 4, numBits = 3, i, bits, resb, maxpower, power; int c = 0; string entry = "", w; StringBuilder result = new StringBuilder(); var data = new dataStruct(){ val = getNextValue(0), position = resetValue, index = 1 }; for (i = 0; i < 3; i++) { dictionary[i] = Convert.ToChar(i).ToString(); } bits = 0; maxpower = (int)Math.Pow(2, 2); power = 1; while(power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if(data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } switch(next= bits) { case 0: bits = 0; maxpower = (int)Math.Pow(2, 8); power = 1; while (power != maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } c = Convert.ToInt32(f(bits)); break; case 1: bits = 0; maxpower = (int)Math.Pow(2, 16); power = 1; while(power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if(data.position==0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } c = Convert.ToInt32(f(bits)); break; case 2: return ""; } dictionary[3] = Convert.ToChar(c).ToString(); w = Convert.ToChar(c).ToString(); result.Append(Convert.ToChar(c)); while (true) { if (data.index > length) { return ""; } bits = 0; maxpower = (int)Math.Pow(2, numBits); power = 1; while (power != maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } switch (c = bits) { case 0: bits = 0; maxpower = (int)Math.Pow(2, 8); power = 1; while(power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = f(bits).ToString(); c = dictSize - 1; enlargeIn--; break; case 1: bits = 0; maxpower = (int)Math.Pow(2, 16); power = 1; while(power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb > 0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = f(bits).ToString(); c = dictSize - 1; enlargeIn--; break; case 2: return result.ToString(); } if(enlargeIn==0) { enlargeIn = (int)Math.Pow(2, numBits); numBits++; } if(dictionary.ContainsKey(c)) { entry = dictionary[c]; } else { if(c==dictSize) { entry = w + w[0].ToString(); } else { return null; } } result.Append(entry); //Add w+entry[0] to the dictionary. dictionary[dictSize++] = w + entry[0].ToString(); enlargeIn--; w = entry; if(enlargeIn ==0) { enlargeIn = (int)Math.Pow(2, numBits); numBits++; } } }