Beispiel #1
0
        private void InitDecode()             // декодируем файл
        {
            byte[] ext = new byte[bcache[0]]; // читаем исходное расширение
            for (int i = 0; i < ext.Length; i++)
            {
                ext[i] = bcache[i + 1];
            }

            string ExtensionOrigFile = Encoding.ASCII.GetString(ext);
            UInt32 powInd            = (UInt32)ext.Length + 1; // место pow в запакованном файле

            pow = bcache[powInd];                              // читаем POW

            UInt32 SizeTable = 1u << pow;                      // размер таблицы для вычисления байт при раскодировке размером 2^pow

            byte[] TableFtoS = new byte[SizeTable];            // читаем таблицу для декодирования размером 2 в степени pow
            Array.Copy(bcache, powInd + 1, TableFtoS, 0, SizeTable);

            UInt32 PackTableInd  = powInd + 1 + SizeTable;               // место начала закодированных данных в запакованном файле
            UInt32 PackTableSize = (UInt32)bcache.Length - PackTableInd; // размер закодированных данных в запакованном файле

            byte[] PackTable = new byte[PackTableSize];                  // читаем упакованные данные для распаковки и записи в дальнейшем в распакованный файл

            Array.Copy(bcache, PackTableInd, PackTable, 0, PackTableSize);

            RNS.Decoder dec = new RNS.Decoder(TableFtoS, PackTable, pow); // готовим декодирование PackTable

            byte[] OUT = dec.GetByte();                                   // раскодированнй массив

            IWriter bw = new BinWriter();                                 // подготовка записи раскодированного файла

            bw.WriteFile(fileName, ExtensionOrigFile, OUT);
        }
Beispiel #2
0
        private void InitEncode()                                   // кодируем файл
        {
            IWriter bw = new BinWriter();                           // подготовка записи закодированного файла

            Array.Reverse(bcache);                                  // для кодирования разворачиваем исходный массив байт (LIFO)
            bw.WriteFile(fileName, (byte)ext.Length);               // 1 - записываем размер расширения в файл архива
            bw.ContinueWriteToFile(ext);                            // 2 - записываем расширение
            bw.ContinueWriteToFile(pow);                            // 3 - записываем степень

            RNS.Encoder enc = new RNS.Encoder(bcache, pow, 77777);  // подготовка кодирования массива bcache со степенью pow с начальной инициализацией кодировщика (77777) - также проверяется на это число в раскодировке

            byte[] TableFtoS = enc.CalculateTableFrequencyToByte(); // рассчет таблицы для вычисления байт при дальнейшей раскодировке размером 2^pow

            bw.ContinueWriteToFile(TableFtoS);                      // 4 - записываем рассчитанную на предыдущем шаге таблицу

            UInt16[] xArray = enc.GetState();                       // получаем массив чисел - состояние кодировщика

            bw.ContinueWriteToFile(xArray);                         // 5 - записываем состояние кодировщика
        }