Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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
            }));
        }
Exemplo n.º 6
0
        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));
        }
Exemplo n.º 7
0
        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
            }));
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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));
        }
Exemplo n.º 11
0
        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));
        }
Exemplo n.º 12
0
        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);
        }