2010-12-14 3 views
1

Я пытаюсь раздуть строку с помощью демпфирования zlib, но он не работает, по-видимому, потому что у него нет правильного заголовка. Я читал в другом месте, что решение C# для этой проблемы:C++ zlib inflate failing - перевод C# fixup?

public static byte[] FlateDecode(byte[] inp, bool strict) { 
    MemoryStream stream = new MemoryStream(inp); 
    InflaterInputStream zip = new InflaterInputStream(stream); 
    MemoryStream outp = new MemoryStream(); 
    byte[] b = new byte[strict ? 4092 : 1]; 
    try { 
     int n; 
     while ((n = zip.Read(b, 0, b.Length)) > 0) { 
      outp.Write(b, 0, n); 
     } 
     zip.Close(); 
     outp.Close(); 
     return outp.ToArray(); 
    } 
    catch { 
     if (strict) 
      return null; 
     return outp.ToArray(); 
    } 
} 

Но я ничего не знаю о C#. Я могу предположить, что все, что он делает, это добавление префикса в строку, но что это за префикс, я понятия не имею. Кто-нибудь сможет выразить эту функцию (или даже просто создание заголовка и конкатенацию строк) на C++?

Данные, которые я пытаюсь раздуть, взяты из PDF с использованием дефляции zlib.

Благодаря миллиона, Wyatt

+0

вы можете отформатировать свой код, выбрав его и нажав значок «101010». Я сделал это на этот раз. –

+0

Извините, просто недосмотр. Научите меня работать в четыре часа ночи. – wyatt

+0

Сначала попробуйте фактически сдуть некоторые случайные данные с помощью zlib. Если ваш код может раздуть его, тогда проблема связана с данными, которые у вас есть. В противном случае отправьте свой код на C++, чтобы мы могли искать возможные ошибки вместе. –

ответ

1

У меня был лучше удач, используя SharpZipLib для zlib Interop, чем с родными классами .Net Framework. Это правильно обрабатывает потоки из C++ (zlib native) и из классов сжатия Java без какого-либо смешного бизнеса.

+0

Спасибо за это, и я буду помнить об этом в будущем. К сожалению, я пока не использую .NET. Вы знаете какое-либо альтернативное решение, которое будет работать с mingw? – wyatt

+0

@wyatt - Я вижу, что мой ответ пропустил вашу мысль. Почему вы не публикуете свой код на C++, который терпит неудачу, и отбирайте его оттуда?Вы можете отредактировать код C++ в вопросе. zlib в C++ должен быть slam dunk, в зависимости от того, откуда пришел поток (какая информация также должна быть включена в вопрос). –

+1

Если вы не используете .NET, какова цель этого вопроса? Если ваш вопрос - код на C++, это может помочь НЕ отправлять код C# и задавать вопрос .NET. –

0

Я не вижу никаких префиксов, извините. Вот как выглядит логика; жаль, что это не в C++:

MemoryStream stream = new MemoryStream(inp); 
InflaterInputStream zip = new InflaterInputStream(stream); 

Создать поток раздувать из данных, передаваемых

MemoryStream outp = new MemoryStream(); 

Создание потока буфера памяти для вывода

byte[] b = new byte[strict ? 4092 : 1]; 
try { 
    int n; 
    while ((n = zip.Read(b, 0, b.Length)) > 0) { 

Если вы находитесь в строгой режим, read up to 4092 bytes - или 1 в нестандартном режиме - в буферный буфер

 outp.Write(b, 0, n); 

Написать все байты декодированные (может быть меньше, чем 4092) в буферной памяти выходного потока

zip.Close(); 
    outp.Close(); 
    return outp.ToArray(); 

очистки, и возвращают в буферную выходной поток памяти в виде массива.

Я немного смущен: почему бы не просто отрезать массив b на n элементах и ​​вернуть их, а не пройти через MemoryStream? Код также должен позаботиться о том, чтобы очистить потоки памяти и zip от исключения (например, с помощью using), так как они все IDisposable, но я думаю, это не так важно, поскольку они не соответствуют файлам ввода-вывода, только структуры памяти.