Сжатие / Распаковка в программе - PullRequest
0 голосов
/ 16 сентября 2011

Я был во всей этой проблеме в программном применении методов сжатия данных ... Я искал и нашел много сайтов по этой теме, но, похоже, ни один из них не помог мне.

Для моегопоследние находки, у меня есть: Простой объект для byte [] и byte [] для методов объекта (я предпочитаю это) & Довольно более сложное расширение класса

Ониоба сжимаются очень хорошо, но выдают ошибку во время распаковки.

МОЯ ЦЕЛЬ: -> Сжатие и запись данных в память в файл.-> Чтение из файла и распаковка данных.

Основная программа, которая должна использовать это, имеет строку, содержащую объекты, все разделенные тегом ;каждый объект содержит шесть строк и изображение (преобразованное в строку), разделенных тегом .

Я написал простую «тестовую» программу для эксперимента, прежде чем окончательно применить ... это код:

    private void btnCompress_Click(object sender, EventArgs e)
    {
        try
        {
            Encoding enc = new UTF32Encoding();
            richTextBox1.Text = enc.GetString(CompressionStyle2.Compress(richTextBox1.Text));
        }
        catch (Exception ex) { MessageBox.Show(ex.ToString()); }
    }

    private void btnDecompress_Click(object sender, EventArgs e)
    {
        try
        {
            Encoding enc = new UTF32Encoding();
            richTextBox1.Text = (string)CompressionStyle2.Decompress(enc.GetBytes(richTextBox1.Text));
        }
        catch (Exception ex) { MessageBox.Show(ex.ToString()); }
    }

(мне не важна эффективность в фиктивных программах - хотя я и стараюсь не делать небрежную работу)

Что я могу делать неправильно?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

enc.GetString() работает только в том случае, если данные, которые вы передаете ему, действительно являются закодированной строкой.

Но в вашем случае вы не передаете закодированную строку этому методу.Вы передаете байтовый массив, содержащий выходные данные шага сжатия.Сжатие производит "кучу байтов".И невозможно просто сгенерировать строку из этого набора байтов.

То, что вы делаете неправильно, предполагает, что байтовый массив является байтовым массивом, и вы можете вызвать Encoding.GetString() для любого байтового массива, который вам нравится.Это не работает таким образом.

Как сказал Бен Фойгт, вам нужно будет закодировать массив байтов в некоторой форме, прежде чем отображать его в текстовом поле.Если вы хотите преобразовать байтовый массив в отображаемую строку, то закодируйте его с помощью шага шестнадцатеричного кодирования, или base64, или чего-то еще.

Затем вам нужно будет сделать обратное (декодировать), когда вы хотите распаковать.

0 голосов
/ 16 сентября 2011

Вы пытаетесь сохранить двоичные данные в текстовом поле.Это может привести к усечению в первом NUL и, возможно, к повреждению данных другими способами (например, символы возврата не могут быть сохранены).

Используйте Base64 или что-то подобное, если вам нужно обрабатывать сжатый вывод как текст.

Или просто пропустите текстовое поле и попробуйте уже использовать двоичный файл.

...