如何从BZ2_bzBuffToBuffCompress获取压缩数据的大小

时间:2013-12-22 00:25:10

标签: c++ compression

我想压缩一个字符串并获取压缩数据的大小...但不管我传递给我的函数的字符串是什么,它总是返回相同的结果: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 个答案:

答案 0 :(得分:1)

您的错误在这里:

    unsigned int sourceLength = sizeof(source);

总是4或8(取决于你的机器是否有32位或64位指针),而不是你发送的数据缓冲区的实际长度。如果你发送的数据缓冲区是一个C字符串,那么您需要使用strlen(source)strlen(source) + 1,具体取决于您是否要包含终止NUL。

如果缓冲区是一个C字符串,那么你需要将缓冲区的实际大小传递给compressedLength()函数,因为它无法找到它的大小