Gzip压缩/解压缩长字符数组

时间:2014-12-08 17:46:07

标签: c++ arrays visual-c++ gzip crypto++

我需要压缩一个大字节数组,我已经在应用程序中使用了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,并且它明显不完整。也许它太长了。 我怎么能重写那些压缩/解压缩函数来处理那个字节数组? 谢谢你们。 :)

1 个答案:

答案 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是最低压缩之一。您可以考虑使用9Gzip::MAX_DEFLATE_LEVEL(即9)。默认日志 2 窗口大小是最大尺寸,因此无需在其上旋转任何旋钮。

Gzip zipper(new StringSink(result), Gzip::MAX_DEFLATE_LEVEL);

您还应该为声明命名。我在使用匿名声明时看到GCC生成了错误的代码。

最后,使用long_array(或类似),因为array是C ++ 11中的关键字。