我正在测试一个压缩库,它对我来说很好用,但是我需要一个包装函数来避免一些不需要的参数。库调用如下所示:
typedef int WINAPI OodleLZ_CompressFunc(
uint32_t codec, char *src_buf, uint64_t src_len, char *dst_buf, int64_t level,
void *opts, int64_t offs);
typedef int WINAPI OodleLZ_DecompressFunc(
char *src_buf, int64_t src_len, char *dst_buf, uint64_t dst_size, int fuzz, int crc, int verbose,
uint8_t *dst_base, size_t e, void *cb, void *cb_ctx, void *scratch, size_t scratch_size, int threadPhase
);
我分配的功能如下:
OodleLZ_CompressFunc* oodl_compress;
OodleLZ_DecompressFunc* oodl_decompress;
当我调用解压缩功能时,使用oodl_compress
和oodl_decompress
的压缩功能一切正常。但是,当我为函数创建包装时,压缩将停止工作。
工作场景:
// Predefined data, compressed_size, decompressed_size
char *dec_data = new char [decompressed_size];
oodl_decompress(data, compressed_size, dec_data, decompressed_size, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
char *com_data = new char [decompressed_size + 0x10000];
oodl_compress(c_type, dec_data, decompressed_size, com_data, c_level, 0, 0); //c_type and c_level are constants (7 in this case)
[当我创建包装器Decompress
时,调用Decompress
有效,但不再调用oodl_compress
。Decompress
:
int Decompress(char* src_buf, int64_t src_len, char* dst_buf, uint64_t dst_len)
{
oodl_decompress(src_buf, src_len, dst_buf, dst_len, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
main.cpp
:
// Predefined data, compressed_size, decompressed_size
char *dec_data = new char [decompressed_size];
Decompress(data, compressed_size, dec_data, decompressed_size);
char *com_data = new char [decompressed_size + 0x10000];
oodl_compress(c_type, dec_data, decompressed_size, com_data, c_level, 0, 0); //c_type and c_level are constants (7 in this case)
发生的情况是,在第二种情况下调用oodl_compress
时,程序将冻结1秒钟,然后退出,而不会出现任何错误。之后,我得到的代码仅是fout<<
到文件中,我可以看到在第二种情况下该文件为空,在第一种情况下该文件被重新压缩,代表数据的原始状态。
我似乎不知道问题出在哪里,因为我只是将变量传递到另一个函数中,该函数仅用0填充其余参数,而不是将其保存在main中。我知道这不是必需的,但是了解这种情况下的错误将有助于我将来避免这种情况。
我找到了问题,但我不知道为什么是问题。
在我的解压缩功能中:
void Decompress(char* src_buf, int64_t src_len, char* dst_buf, uint64_t dst_len)
{
int data_size = oodl_decompress(src_buf, src_len, dst_buf, dst_len, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
if (data_size < 0)
{
throw std::string("Decompression Error");
}
}
以及我的压缩功能:
int64_t Compress(char *src_buf, uint64_t src_len, char* dst_buf)
{
int64_t data_len;
data_len = oodl_compress(compression_type, src_buf, src_len, dst_buf, compression_level, 0, 0);
return data_len;
}
这两种情况的罪魁祸首都是data_len
和data_size
变量。由于某种原因,无论何时删除它们,代码都可以正常工作。我猜这与堆栈/堆有关吗? (我对术语不是很好)。对此有任何见识,并提出了建议的解决方案/替代方案!现在,我只是将两个函数互换为:
int64_t Compress(char *src_buf, uint64_t src_len, char* dst_buf)
{
return oodl_compress(compression_type, src_buf, src_len, dst_buf, compression_level, 0, 0);
}
void Decompress(char* src_buf, int64_t src_len, char* dst_buf, uint64_t dst_len)
{
oodl_decompress(src_buf, src_len, dst_buf, dst_len, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}