Я пытался сдуть и надуть строку, и это работает:
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))
Может ли кто-нибудь помочь / научить меня? Спасибо вам
В соответствии с руководство по 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.