Как получить размер сжатых данных из BZ2_bzBuffToBuffCompress
Я хочу сжать строку и получить размер сжатых данных... но независимо от того, какую строку я передаю своей функции, она всегда возвращает один и тот же результат: 39. Любой совет очень ценится.
int compressedLength(char * source){
ostringstream oss;
int blockSize100k = 9;
int verbosity = 0;
int workFactor = 30; // 0 = USE THE DEFAULT VALUE
unsigned int sourceLength = sizeof(source);
unsigned int destLength = 1.01 * sourceLength + 600; // Official formula, Big enough to hold output. Will change to real size.
char *dest = (char*)malloc(destLength);
int returnCode = BZ2_bzBuffToBuffCompress( dest, &destLength, source, sourceLength, blockSize100k, verbosity, workFactor );
if (returnCode == BZ_OK)
{
free(dest);
return destLength;
}
else
{
free(dest);
cout << " Can't get compressed length. " << "Error code:" << returnCode;
return returnCode;
}
}
1 ответ
Решение
Ваша ошибка здесь:
unsigned int sourceLength = sizeof(source);
Это всегда будет 4 или 8 (в зависимости от того, имеет ли ваша машина 32-битные или 64-битные указатели), а не фактическую длину буфера данных, который вы отправили. Если буфер данных, который вы отправили, является строкой C, то вы нужно использовать либо strlen(source)
или же strlen(source) + 1
в зависимости от того, хотите ли вы включить завершающий NUL.
Если буфер не является строкой C, то вам нужно передать фактический размер буфера compressedLength()
функция, так как в противном случае он не может узнать его размер.