bool minilzo_compress(unsigned char* input, size_t inlen, unsigned char** output, size_t* outlen) {
lzo_uint srclen = inlen;
lzo_uint dstlen = srclen + (srclen / 16) + 64 + 3; // 这是正确的计算公式
uint8_t* compressed = (uint8_t*)malloc(dstlen);
uint8_t* wrkmem = (uint8_t*)malloc(LZO1X_1_MEM_COMPRESS);
if (LZO_E_OK !=
lzo1x_1_compress(input, srclen, compressed, &dstlen, wrkmem)) {
memset(compressed,0, dstlen);
memset(wrkmem, 0,LZO1X_1_MEM_COMPRESS);
free(compressed);
free(wrkmem);
if (output)
*output = 0;
*outlen = 0;
return false;
}
free(wrkmem);
if (output)
*output = compressed;
else
{
memset(compressed, 0,dstlen);
free(compressed);
}
*outlen = dstlen;
return true;
}
//如果解压缩的数据大于两倍的输入长度,直接崩溃,一般情况下应该使用minilzo_decompress_safe
bool minilzo_decompress(unsigned char* input, size_t inlen, unsigned char** output, size_t* outlen) {
lzo_uint srclen = inlen;
lzo_uint dstlen = srclen * 2; // 与输入缓冲区同等大小,这是正确的方式
uint8_t* decompressed = (uint8_t*)malloc(dstlen);
if (LZO_E_OK !=
lzo1x_decompress(input, srclen, decompressed, &dstlen, 0)) {
memset(decompressed,0, dstlen);
free(decompressed);
if (output)
*output = 0;
*outlen = 0;
return false;
}
if (output)
*output = decompressed;
else
{
memset(decompressed,0, dstlen);
free(decompressed);
}
*outlen = dstlen;
return true;
}
bool minilzo_decompress_safe(unsigned char* input, size_t inlen, unsigned char** output, size_t* outlen) {
lzo_uint srclen = inlen;
lzo_uint buflen = srclen * 2;
lzo_uint dstlen;
uint8_t* decompressed = (uint8_t*)malloc(buflen);
int result;
while (1) {
dstlen = buflen;
result = lzo1x_decompress_safe(input, srclen, decompressed, &dstlen, 0);
if (result != LZO_E_OUTPUT_OVERRUN)
{
break;
}
//输出缓冲区不够大
free(decompressed);
buflen *= 2;
decompressed = (uint8_t*)malloc(buflen);
}
if (LZO_E_OK !=
result) {
memset(decompressed, 0, dstlen);
free(decompressed);
if (output)
*output = 0;
*outlen = 0;
return false;
}
if (output)
*output = decompressed;
else
{
memset(decompressed, 0, dstlen);
free(decompressed);
}
*outlen = dstlen;
return true;
}
miniLZO的使用
由
·
发表回复