miniLZO的使用

·

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;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注