压缩 API:是时候了






4.67/5 (7投票s)
在 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:首次发布