C ++ zlib надувать не удалось - перевод c # fixup? - PullRequest
1 голос
/ 14 декабря 2010

Я пытаюсь раздувать строку, используя deflate zlib, но она терпит неудачу, очевидно, потому что у нее нет правильного заголовка Я читал в другом месте, что C # решение этой проблемы:

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

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

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

0 голосов
/ 14 декабря 2010

Я не вижу префиксов, извините.Вот что такое логика;извините, этого нет в 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) {

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

        outp.Write(b, 0, n);

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

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

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

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

...