C ++ и zlib, помогите выкачать строку

Я пытался сдуть и надуть строку, и это работает:

char text[600] = "Testing deflating and inflating";
char out[600];
uLong ucompSize = strlen(text) + 1;
uLong compSize = compressBound(ucompSize);
// Deflate
compress((Bytef *)out, &compSize, (Bytef *)text, ucompSize);

Но моя проблема в том, что необходимое пространство для out (и самой строки) может сильно различаться, я пытался использовать std :: string, но это не работает, я получаю следующую ошибку:

_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

_CrtIsValidHeapPointer(pUserData)

Мой текущий код с std :: string

char text[600] = "Testing deflating and inflating";
std::string out;
uLong ucompSize = strlen(text) + 1;
uLong compSize = compressBound(ucompSize);
// Deflate
compress((Bytef *)out.data(), &compSize, (Bytef *)text, ucompSize);

Я искал в Google, но я не могу найти решение, мне просто нужно надуть и сдуть большие строки. Я не очень хорош в C ++ (я всегда работаю с Ruby, где я могу сделать это только с помощью Zlib :: Deflate.deflate (@string))

Может ли кто-нибудь помочь / научить меня? Спасибо вам

2

Решение

В соответствии с руководство по zlib функция compress:

Сжимает исходный буфер в целевой буфер. sourceLen является
длина байта исходного буфера. При входе destLen это общее
размер буфера назначения, который должен быть не меньше значения
вернулся compressBound(sourceLen), На выходе, DestLen является фактическим
размер сжатого буфера.

C ++ std :: string нельзя использовать для такого буфера. Функция-член std::string::data() возвращает строковый буфер только для чтения, который не должен изменяться внешними функциями.

В C ++ 11 можно использовать std::vector::data() для такого буфера после выделения достаточного размера для вектора байтов: std::vector<char> out(compressBound(sourceLen));

Здесь для функций стиля C также может быть проще выделить этот буфер, используя malloc, Однако в этом случае буфер должен быть освобожден вручную (в случае вектора C ++ буферная память освобождается, когда экземпляр вектора уничтожается).

Итак, код C ++ 11 может выглядеть так:

{
char text[600] = "Testing deflating and inflating";
uLong ucompSize = strlen(text) + 1;
uLong compSize = compressBound(ucompSize);
std::vector<char> dest(compSize); // allocate enough size for output buffer
// Deflate
int error = compress((Bytef *)dest.data(), &compSize, (Bytef *)text, ucompSize);
// here if error code is Z_OK the variable compSize contains size of
// compressed data that is usually smaller than initial buffer size.
// vector size may be adjusted to actual size of compressed data
dest.resize(compSize);

// do something with compressed data
// ...
}
// here the vector 'dest' is out of block scope;
// it is automatically destroed and the buffer is not valid anymore.
1

Другие решения


По вопросам рекламы [email protected]