RunLengthDecode в c # - PullRequest
       22

RunLengthDecode в c #

0 голосов
/ 29 января 2019

Я имею дело с файлами CIP3 - это файлы со смешанным содержимым (бинарные \ текстовые).У меня есть файл, данные его изображения сжимаются с помощью фильтра RunLengthDecode (из PostScript) и кодируются с помощью ASCIIHexDecode.

ASCIIHexDecode все в порядке (просто преобразовать двоичный файл в шестнадцатеричный), но я не могу найти приличную RLEАлгоритм декомпрессии.Я искал в Google много, StackOverflow, везде - прежде чем спрашивать.Кто-нибудь может дать мне какой-либо вклад по этому вопросу?

До сих пор я пытался распаковать с помощью этого алгоритма:

public enum EncodingFormat
{
    Old,

    New,
}

public static class Rle
{
    public const char EOF = '\u007F';
    public const char ESCAPE = '\\';
    private static bool HasChar(StringBuilder input)
    {
        for (var i = 0; i < input.Length; i++)
        {
            if (char.IsLetter(input[i]))
            {
                return true;
            }
        }

        return false;
    }


    internal static void Decode(string input)
    {
        int fileCounter = 0;            
        //var runLengthEncodedString = new StringBuilder();
        var baseString = input;

        var radix = 0;

        for (var i = 0; i < baseString.Length; i++)
        {
            if (char.IsNumber(baseString[i]))
            {
                radix++;
            }
            else
            {
                if (radix > 0)
                {
                    try
                    {

                        var valueRepeat = Convert.ToInt64(baseString.Substring(i - radix, radix));

                        for (var j = 0; j < valueRepeat; j++)
                        {
                            File.AppendAllText(@"C:\test\hexdecoded.txt",baseString[i].ToString());

                        }

                        radix = 0;
                    }
                    catch(Exception e)
                    {
                        var checkI = i;

                    }


                }
                else if (radix == 0)
                {
                    File.AppendAllText(@"C:\test\hexdecoded.txt", baseString[i].ToString());

                }
            }
        }



    }

    internal static double GetPercentage(double x, double y)
    {
        return (100 * (x - y)) / x;
    }
}

Должен сказать, что я нашел этот код в StackOverflow, ноне могу вспомнить, где сейчас.Я изменил вывод содержимого на диск, потому что я получаю ошибку исключения памяти.Но для распаковки моего изображения требуются годы (ждал один час и все еще распаковывал).Если мне удастся исправить распаковку этого образа RLE, я могу преобразовать его в байты и затем создать правильный файл TIFF.

Я загрузил образец файла, который я использую для тестов: CIP3Образец файла

Любой вклад приветствуется.Спасибо.

1 Ответ

0 голосов
/ 06 февраля 2019

Из справочника PostScript, третье издание :

Фильтр RunLengthEncode кодирует данные в простом байтово-ориентированном формате, основанном на длине прогона.Формат сжатых данных представляет собой последовательность прогонов, где каждый прогон состоит из байта длины, за которым следуют от 1 до 128 байтов данных.Если длина байта находится в диапазоне от 0 до 127, следующая длина + 1 байт (от 1 до 128 байт) должна быть скопирована буквально после распаковки.Если длина находится в диапазоне от 129 до 255, следующий одиночный байт должен быть реплицирован 257 - раз длина (от 2 до 128 раз) после распаковки.

система байтов длины, где старший битопределяет, будет ли выполняться команда копирования или повтора так называемой RLE на основе кода.Более подробную информацию о RLE, включая объяснение типа, основанного на коде, можно найти здесь:

http://www.shikadi.net/moddingwiki/RLE_Compression

...