【发布时间】:2020-01-03 18:56:56
【问题描述】:
我的代码可以运行,但我对结果并不完全满意,所以我想我可以在这里问一些问题。
这是我的两个功能:
void compress(string nameSrc, string nameDst){
ifstream input;
input.open(nameSrc,fstream::in | fstream::binary);
size_t propsSize = LZMA_PROPS_SIZE;
size_t srcLen = getLength(input);
size_t dstLen = srcLen; //??? no idea how to know to right value here
unsigned char* src = new unsigned char[srcLen];
unsigned char* dst = new unsigned char[dstLen + propsSize];
input.read((char*)src, srcLen);
int res = LzmaCompress(
&dst[LZMA_PROPS_SIZE], &dstLen,
src, srcLen,
dst, &propsSize,
-1, 0, -1, -1, -1, -1, -1);
delete [] src;
input.close();
ofstream output(nameDst, ios::binary);
output.write((char*)dst, dstLen + propsSize);
delete [] dst;
}
和:
void unCompress(string nameSrc, string nameDst){
ifstream input;
input.open(nameSrc,fstream::in | fstream::binary);
size_t srcLen = getLength(input);
size_t dstLen = srcLen*5; //??? no idea how to know to right value here
unsigned char* src = new unsigned char[srcLen];
unsigned char* dst = new unsigned char[dstLen];
input.read((char*)src,srcLen);
int res = LzmaUncompress(dst,&dstLen,&src[LZMA_PROPS_SIZE],&srcLen, src, LZMA_PROPS_SIZE);
delete [] src;
input.close();
ofstream output(nameDst, ios::binary);
output.write((char*)dst, dstLen);
delete [] dst;
}
- 在这两个函数中,我应该如何知道将什么值放入 dstLen ?我不想白白分配大量内存。
- 我必须强制转换为 char* 是不是很糟糕?我真的必须使用 unsigned char 吗?
- 我尝试更改 LzmaCompress (numThreads) 的最后一个参数,但它并没有提高性能,甚至一点也没有。还有其他事情要做吗?
- 如果您有任何提示,请随时告诉我。
谢谢。
【问题讨论】:
-
那么,这些
Lzma*ompress()函数是什么,它们从何而来?有关于他们的任何文件吗?虽然我可以想象后处理的大小可能是未知的(特别是对于压缩),但压缩数据可能包括应该很容易提取的原始大小。文档和压缩算法的解释还应该让您了解numThreads参数,不管它是否有用(一些压缩/解压缩算法本质上是顺序的,不能并行化)。 -
它们来自 LZMA SDK (7-zip.org/sdk.html)。是的,一旦数据被压缩,我就可以知道它的大小。我的问题是我必须在那之前分配内存。