【问题标题】:lzma compress/Uncompress from memory c++lzma从内存c ++中压缩/解压缩
【发布时间】: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;
}

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

谢谢。

【问题讨论】:

  • 那么,这些Lzma*ompress() 函数是什么,它们从何而来?有关于他们的任何文件吗?虽然我可以想象后处理的大小可能是未知的(特别是对于压缩),但压缩数据可能包括应该很容易提取的原始大小。文档和压缩算法的解释还应该让您了解numThreads 参数,不管它是否有用(一些压缩/解压缩算法本质上是顺序的,不能并行化)。
  • 它们来自 LZMA SDK (7-zip.org/sdk.html)。是的,一旦数据被压缩,我就可以知道它的大小。我的问题是我必须在那之前分配内存。

标签: c++ 7zip lzma


【解决方案1】:

使用以下函数获取目标大小:

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

【讨论】:

    【解决方案2】:

    我认为你可以将源文件的长度保存到压缩文件中。 解压时可以通过压缩文件读取源文件的长度。

    当然,你可以用这个来压缩,这是我多次搜索的结果

    dstLen = LZMA_PROPS_SIZE + srcLen + srcLen/3 + 128

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多