Как получить размер сжатых данных из 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() функция, так как в противном случае он не может узнать его размер.

Другие вопросы по тегам