private string TextDecode(BitArray code, int index, Dictionary <char, int> frequencyDictionary, int textLength) { var res = new StringBuilder(); var probabilities = new List <RationalNumber> { 0 }; var mapNumberInSymbols = new Dictionary <int, char>(); foreach (var pair in frequencyDictionary) { mapNumberInSymbols.Add(probabilities.Count, pair.Key); probabilities.Add(new RationalNumber(pair.Value, textLength) + probabilities[probabilities.Count - 1]); } RationalNumber a = 0; RationalNumber b = 1; var c = (RationalNumber)BitArrayConverter.ConvertToBigInteger(code, ref index, code.Length - index, out var digitCnt); c /= BigInteger.Pow(10, digitCnt); for (var i = 0; i < textLength; i++) { var length = b - a; var ind = LowerBound(probabilities, (c - a) / length); res.Append(mapNumberInSymbols[ind]); b = probabilities[ind] * length + a; a = probabilities[ind - 1] * length + a; } return(res.ToString()); }
private BitArray TextCode(string text, Dictionary <char, int> frequencyDictionary) { var res = new BigInteger(0); var digitCnt = 0; var probabilities = new List <RationalNumber>(); var mapSymbolsInNumber = new Dictionary <char, int>(); probabilities.Add(0); foreach (var pair in frequencyDictionary) { mapSymbolsInNumber.Add(pair.Key, probabilities.Count); probabilities.Add(new RationalNumber(pair.Value, text.Length) + probabilities[probabilities.Count - 1]); } RationalNumber a = 0; RationalNumber b = 1; foreach (var c in text) { var index = mapSymbolsInNumber[c]; var length = b - a; b = probabilities[index] * length + a; a = probabilities[index - 1] * length + a; while (RetrieveCode(ref a, ref b, ref res, ref digitCnt)) { } } res = res * 10 + a.FirstDigitAfterDot() + 1; digitCnt++; return(BitArrayConverter.ConvertToBitArray(res, digitCnt)); }
public string Decode(BitArray code, out int codeLength) { var index = 0; var length = BitArrayConverter.ConvertToInt(code, ref index, 32); var dict = FrequencyDictionaryCoder.GetDictionary(code, ref index); codeLength = code.Length - index; return(TextDecode(code, index, dict, length)); }
private BitArray TextCode(string text, Dictionary <char, BitArray> codesDictionary) { var bitArrays = new List <BitArray>(); foreach (var c in text) { bitArrays.Add(codesDictionary[c]); } return(BitArrayConverter.ConvertToBitArray(bitArrays)); }
private BitArray GetCode(string text, Dictionary <char, BitArray> codesDictionary, out int codeLength) { var dictionaryCode = CodesDictionaryCoder.GetCode(codesDictionary); var textCode = TextCode(text, codesDictionary); codeLength = textCode.Length; return(BitArrayConverter.ConvertToBitArray(new List <BitArray>() { dictionaryCode, textCode })); }
private BitArray ListOfPairsToBitArray(List <Pair <char, int> > listOfPairs) { var arrays = new List <BitArray>(); foreach (var pair in listOfPairs) { arrays.Add(BitArrayConverter.ConvertToBitArray(pair.First)); arrays.Add(BitArrayConverter.ConvertToBitArray(pair.Second, LengthOfNumber)); } return(BitArrayConverter.ConvertToBitArray(arrays)); }
private BitArray GetCode(string text, Dictionary <char, int> frequencyDictionary, out int codeLength) { var length = BitArrayConverter.ConvertToBitArray(text.Length, 32); var dictionaryCode = FrequencyDictionaryCoder.GetCode(frequencyDictionary); var textCode = TextCode(text, frequencyDictionary); codeLength = textCode.Length; return(BitArrayConverter.ConvertToBitArray(new List <BitArray>() { length, dictionaryCode, textCode })); }
private List <Pair <char, int> > BitArrayToListOfPairs(BitArray code) { var res = new List <Pair <char, int> >(); var index = 0; while (index < code.Length) { var symbol = BitArrayConverter.ConvertToChar(code, ref index); var number = BitArrayConverter.ConvertToInt(code, ref index, LengthOfNumber); res.Add(new Pair <char, int>(symbol, number)); } return(res); }
public static Dictionary <char, int> GetDictionary(BitArray code, ref int index) { var res = new Dictionary <char, int>(); var cnt = BitArrayConverter.ConvertToInt(code, ref index, 8); for (var _ = 0; _ < cnt; _++) { var symbol = BitArrayConverter.ConvertToInt(code, ref index, 16); var newCode = BitArrayConverter.ConvertToInt(code, ref index, 32); res.Add((char)symbol, newCode); } return(res); }
public static BitArray GetCode(Dictionary <char, int> frequencyDictionary) { var bitArrays = new List <BitArray>(); var cnt = BitArrayConverter.ConvertToBitArray(frequencyDictionary.Count, 8); bitArrays.Add(cnt); foreach (var pair in frequencyDictionary) { var symbol = BitArrayConverter.ConvertToBitArray(pair.Key, 16); var code = BitArrayConverter.ConvertToBitArray(pair.Value, 32); bitArrays.Add(symbol); bitArrays.Add(code); } return(BitArrayConverter.ConvertToBitArray(bitArrays)); }
public static BitArray GetCode(Dictionary <char, BitArray> codesDictionary) { var bitArrays = new List <BitArray>(); var cnt = BitArrayConverter.ConvertToBitArray(codesDictionary.Count, 8); bitArrays.Add(cnt); foreach (var pair in codesDictionary) { var symbol = BitArrayConverter.ConvertToBitArray(pair.Key, 16); var length = BitArrayConverter.ConvertToBitArray(pair.Value.Length, 5); var code = pair.Value; bitArrays.Add(symbol); bitArrays.Add(length); bitArrays.Add(code); } return(BitArrayConverter.ConvertToBitArray(bitArrays)); }
public static Dictionary <BitArray, char> GetDictionary(BitArray code, ref int index) { var res = new Dictionary <BitArray, char>(new BitArrayComparer()); var cnt = BitArrayConverter.ConvertToInt(code, ref index, 8); for (var _ = 0; _ < cnt; _++) { var symbol = BitArrayConverter.ConvertToInt(code, ref index, 16); var length = BitArrayConverter.ConvertToInt(code, ref index, 5); var newCode = new BitArray(length); for (var i = 0; i < length; i++) { newCode[i] = code[index]; index++; } res.Add(newCode, (char)symbol); } return(res); }