gpt4 book ai didi

c++ - lzma 从内存中压缩/解压缩 C++

转载 作者:行者123 更新时间:2023-11-28 07:46:49 35 4
gpt4 key购买 nike

我有一个代码可以工作,但我对结果并不完全满意,所以我想我可以在这里问一些问题。

这是我的两个函数:

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

  1. 在这两个函数中,我应该如何知道将什么值放入 dstLen ?我不想白白分配大量内存。
  2. 我必须转换为 char* 不好吗?我真的必须使用 unsigned char 吗?
  3. 我尝试更改 LzmaCompress (numThreads) 的最后一个参数,它并没有提高性能,甚至没有一点点提高。还有其他事情要做吗?
  4. 如果您有任何提示,请随时告诉我。

谢谢。

最佳答案

使用以下函数获取目标尺寸:

INT32
EFIAPI
LzmaGetInfo(
CONST VOID *Source,
UINT32 SourceSize,
UINT32 *DestinationSize
)
{
UInt64 DecodedSize;

ASSERT(SourceSize >= LZMA_HEADER_SIZE); (void)SourceSize;

DecodedSize = GetDecodedSizeOfBuf((UINT8*)Source);

*DestinationSize = (UINT32)DecodedSize;
return ERR_SUCCESS;
}

关于c++ - lzma 从内存中压缩/解压缩 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14765617/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com