POCO Library需要一個istream用於輸入,而另一個用於輸出的ostream用它的zlib包裝來壓縮數據。我有一個std :: vector(unsigned char)數據,並想將這些數據壓縮到另一個std :: vector(unsigned char)中。有沒有簡單的方法來做到這一點?用POCO壓縮矢量(C++)
1
A
回答
2
我不知道,這是最有效的方式,但作爲一個開始我想試試這個:
typedef unsigned char uc;
typedef vector<uc> v;
void Doit(const v& in, v& out)
{
ostringstream outStream;
DeflatingOutputStream compressor(outStream, DeflatingStreamBuf::STREAM_GZIP);
copy(in.begin(), in.end(), ostream_iterator<uc>(compressor));
compressor.close();
string outStr(outStream.str());
out.assign(outStr.begin(), outStr.end());
}
我懷疑這將數據複製兩次,不必要的。首先,調用ostringstream :: str()生成一個副本,然後std :: vector :: assign()創建一個副本。
@Alf P. Steinbach有一個很好的建議 - 使用Boost流適配器。如果您有boost::iostreams::filtering_ostream
可供您使用,您可以試試這個:
typedef unsigned char uc;
typedef vector<uc> v;
void Doit(const v& in, v& out)
{
filtering_ostream outStream(back_inserter(out));
DeflatingOutputStream compressor(outStream, DeflatingStreamBuf::STREAM_GZIP);
std::copy(in.begin(), in.end(), ostream_iterator<uc>(compressor));
compressor.close();
outStream.flush();
}
2
您可以使用正常的istream
和ostream
對象,並使用方法their streambuf
s將流的內部緩衝區設置爲向量的內部緩衝區。
在這種情況下,您將不得不確保接收輸出的矢量具有足夠的可用空間。由於ostream會直接寫入緩衝區,因此不會自動調整大小。
相關問題
- 1. 將Poco Zip壓縮到Poco HTTPServerResponse
- 2. R中壓縮不連續的矢量連續矢量從1
- 3. 有沒有一種方法來壓縮矢量(C++)?
- 4. 矢量矢量C++
- 5. JPEG壓縮C#
- 6. c#WebService壓縮
- 7. C#壓縮和JavaScript解壓縮
- 8. 矢量的矢量,C++
- 9. C++矢量矢量故障
- 10. C++。矢量指針和使用矢量
- 11. C++序列化和壓縮矢量<structs>平臺無關的方式
- 12. 用c壓縮avi視頻#
- 13. C#HttpWebRequest - 使用Gzip壓縮
- 14. C#使用.tar壓縮
- 15. 使用矢量C++
- 16. 調用C++矢量
- 17. 隨機數據訪問的壓縮矢量/數組類
- 18. 將矢量壓縮成逗號分隔字符串
- 19. 解壓縮變量
- 20. 如何使用c#壓縮消息並使用javascript解壓縮?
- 21. RLE壓縮在c
- 22. C++的壓縮API
- 23. C#GZipStream - 壓縮MemoryStreams
- 24. 並行壓縮C#
- 25. Zlib解壓縮C++
- 26. Gzip壓縮asp.net c#
- 27. 使用GZipStream C壓縮/解壓縮問題#
- 28. 使用lz4進行C++壓縮,壓縮信息不如預期
- 29. 通過C#使用cmd來壓縮和解壓縮文件
- 30. 如何使用C#解壓縮壓縮文件?
最有可能提供流適配器。如果沒有,那麼最有可能的是Boost。閱讀文檔。 – 2010-12-16 23:47:53