我需要压缩一个大字节数组,我已经在应用程序中使用了Crypto ++库,因此在同一个库中使用压缩/解压缩部分会很棒。
这个小测试按预期工作:
///
string test = "bleachbleachtestingbiatchbleach123123bleachbleachtestingb.....more";
string compress(string input)
{
string result ("");
CryptoPP::StringSource(input, true, new CryptoPP::Gzip(new CryptoPP::StringSink(result), 1));
return result;
}
string decompress(string _input)
{
string _result ("");
CryptoPP::StringSource(_input, true, new CryptoPP::Gunzip(new CryptoPP::StringSink(_result), 1));
return _result;
}
void main()
{
string compressed = compress(test);
string decompressed = decompress(compressed);
cout << "orginal size :" << test.length() << endl;
cout << "compressed size :" << compressed.length() << endl;
cout << "decompressed size :" << decompressed.length() << endl;
system("PAUSE");
}
我需要压缩这样的东西:
unsigned char long_array[194506]
{
0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x04,
0x04,0x00,0x02,0x00,0x01,0x04,0x02,0x00,0x04,
0x01,0x00,0x02,0x02,0x00,0x04,0x02,0x00,0x00,
0x03,0x00,0x02,0x00,0x00,0x04,0x01,0x00,0x04,
....
};
我试图将long_array用作const char *并将其作为byte然后将其提供给compress函数,它似乎被压缩但是解压缩的那个大小为4,并且它明显不完整。也许它太长了。 我怎么能重写那些压缩/解压缩函数来处理那个字节数组? 谢谢你们。 :)
答案 0 :(得分:2)
我试图将数组用作const char *并将其作为字节然后将其提供给compress函数,它似乎被压缩但是解压缩的那个大小为4,并且它显然是不完整的。
使用带pointer and a length的备用StringSource
构造函数。它将不受嵌入式NULL's
的影响。
CryptoPP::StringSource ss(long_array, sizeof(long_array), true,
new CryptoPP::Gzip(
new CryptoPP::StringSink(result), 1)
));
或者,您可以使用:
Gzip zipper(new StringSink(result), 1);
zipper.Put(long_array, sizeof(long_array));
zipper.MessageEnd();
Crypto ++在5.6处添加了ArraySource
。您也可以使用它(但它对typedef
来说真的是StringSource
):
CryptoPP::ArraySource as(long_array, sizeof(long_array), true,
new CryptoPP::Gzip(
new CryptoPP::StringSink(result), 1)
));
用作1
参数的Gzip
是一个降级级别。 1
是最低压缩之一。您可以考虑使用9
或Gzip::MAX_DEFLATE_LEVEL
(即9)。默认日志 2 窗口大小是最大尺寸,因此无需在其上旋转任何旋钮。
Gzip zipper(new StringSink(result), Gzip::MAX_DEFLATE_LEVEL);
您还应该为声明命名。我在使用匿名声明时看到GCC生成了错误的代码。
最后,使用long_array
(或类似),因为array
是C ++ 11中的关键字。