65.9K
CodeProject 正在变化。 阅读更多。
Home

压缩 API:是时候了

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (7投票s)

2015年2月16日

CPOL

1分钟阅读

viewsIcon

29182

downloadIcon

514

在 Win32 中压缩/解压缩数据的能力

引言

可能有点晚了,但他们终于把它实现了。一个易于使用的 Windows 压缩/解压缩 API。而且,通过我的类,甚至更容易。

背景

该 API 是一组简单的函数,允许压缩或解压缩数据。Windows 支持多种算法(https://msdn.microsoft.com/en-us/library/windows/desktop/hh920921(v=vs.85).aspx),我们可以在构造函数中选择。Windows 还支持块模式,如果您想控制压缩器,这在我们的快速类中没有实现。

由于该 API 仅存在于 Windows 8 中,我们所有的类调用都是动态的(顺便说一下,调用使用了我的 单行模板调用 文章中的模板)。您可以检查静态成员 COMPRESSIONAPI::Available() 来查看 API 是否可用。如果 API 不可用,构造对象将会抛出异常。

使用代码

 

//
    if (!COMPRESSIONAPI::Available())
        BlowThisPC(); // :)
   
    COMPRESSIONAPI c(COMPRESS_ALGORITHM_LZMS);
   
    vector<char> x;
    x.resize(10000);
    strcpy_s(x.data(),10000,"Hello there");
   
    vector<char> rs;
    c.Compress(x.data(),10000,rs);

    vector<char> rs2;
    c.Decompress(rs.data(),rs.size(),rs2);

//

 

简单。您有构造函数(指定压缩算法,在本例中为 COMPRESS_ALGORITHM_LZMS)。然后您有两个成员函数,**Compress** 和 **Decompress**。两者都接受要操作的缓冲区、其大小以及用于放置结果的 vector<char>。它们在成功时返回 S_OK,在出错时返回 E_FAIL。

在内部,我的类会测试 API 以确定缓冲区所需的精确大小。

历史

2015-2-16:首次发布

© . All rights reserved.