C++ lzma从存储器c+压缩/解压缩+;

C++ lzma从存储器c+压缩/解压缩+;,c++,7zip,lzma,C++,7zip,Lzma,我有一个代码在工作,但我对结果并不完全满意,所以我想我可以在这里问一些问题 以下是我的两项职能: 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);

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

以下是我的两项职能:

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;


}
以及:


  • 在这两个函数中,我应该如何知道输入dstLen的值?我不想白白分配大量内存
  • 我必须向char*施压是不是很糟糕?我真的必须使用无符号字符吗
  • 我尝试更改LzmaCompress(numThreads)的最后一个参数,它没有提高性能,甚至没有一点点。还有别的事要做吗
  • 如果你有什么建议,尽管告诉我

  • 谢谢。

    使用以下功能获取目的地大小:

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

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

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

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

    当然,您可以使用它进行压缩,这是我多次搜索的结果

    Dslen=LZMA_PROPS_SIZE+srcLen+srcLen/3+128


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

    当然,您可以使用它进行压缩,这是我多次搜索的结果

    Dslen=LZMA_PROPS_SIZE+srcLen+srcLen/3+128


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