Сжатие LZW на C # из строки - PullRequest
0 голосов
/ 15 июля 2011

Я ищу алгоритм сжатия LZW в C #, который принимает «строку» и возвращает строку. Я часами гуглю и все, что нашел, использую MemoryStream, BinaryWriters и т. Д.

Я просто хочу иметь возможность сделать что-то вроде:

string _data = "12345";</p> <p>string _result = CompressToLZW(_data);

и затем передайте эту строку через Ajax в браузер. У меня уже есть алгоритм распаковки LZW для JavaScript (http://rosettacode.org/wiki/LZW_compression#JavaScript)

Спасибо .-

UPDATE:

Это код, который я сейчас использую с http://paste.lisp.org/display/12198 </p> <pre><code> string _data = "12345_12345_12345_12345"; byte[] byteArray = Encoding.ASCII.GetBytes(_data); MemoryStream _st = new MemoryStream(byteArray); StreamReader _sr = new StreamReader(_st); MemoryStream streamoutput = new MemoryStream(); BinaryWriter _output= new BinaryWriter(streamoutput); LZW.Compress(_sr, _output); string _res = (new StreamReader(_output.BaseStream)).ReadToEnd(); return _res;

ОБНОВЛЕНИЕ 2 Я нашел исходный код в C #, который работает на http://code.google.com/p/sharp-lzw/source/browse/ Спасибо .-

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Используйте что-то вроде этого:

private string CompressToLZW(string input)
{
    using (MemoryStream stream = new MemoryStream())
    {
        ComputeLZW(input, stream);
        stream.Seek(0, SeekOrigin.Begin);
        using (StreamReader reader = new StreamReader(stream))
        {
            return reader.ReadToEnd();
        }
    }
}

, где ComputeLZW () - это ваш метод LZW, использующий поток.

1 голос
/ 15 июля 2011

Учитывая, что коды LZW не обязательно должны выходить за границы байтов, простое преобразование двоичного вывода сжатия LZW в строку UTF8 (как в подходе StreamReader), скорее всего, приведет к ошибке, что приведет к неправильному выводу.

Кажется, что функция распаковки Javascript, на которую вы ссылаетесь, на самом деле принимает массив чисел в качестве входных данных.Вероятно, наиболее эффективный способ передачи двоичного вывода в метод распаковки javascript - это кодирование base64 двоичного вывода, затем декодирование base64 на конце JS в массив чисел и предоставление этого метода.

Это может иметь сомнительную эффективность.Стоит проверить перед развертыванием.

0 голосов
/ 15 июля 2011

Вы можете "преобразовать" строку в MemoryStrem следующим образом:

byte[] byteArray = Encoding.ASCII.GetBytes(youInputString);
MemoryStream stream = new MemoryStream(byteArray);

(убедитесь, что вы понимаете, какая кодировка вам нужна).

Другой путь выглядит так:

StreamReader reader = new StreamReader(methodOutputStream);
string text = reader.ReadToEnd();

Чтобы использовать методы, найденные в http://paste.lisp.org/display/12198,, вы можете сначала преобразовать вашу строку в поток, передать ее в методы сжатия LZW, получить выходной поток и преобразовать этот поток в строку. Разница лишь в том, что код на сайте использует FileStreams.

...