はい、 POCOを使用して生メモリ バッファを zip ファイルに追加できます。
次の実行中のコードは、 zero-copy の助けを借りて、その方法を示していますPoco::MemoryInputStream
。で同じことを行うことができますstd::istringstream
が、その場合、バッファーから基になるstd::stringbuf
.
#include <Poco/Exception.h>
#include <Poco/Zip/Compress.h>
#include <Poco/DateTime.h>
#include <Poco/MemoryStream.h>
#include <iostream>
#include <fstream>
using namespace std;
/*
* Compress multiple buffers to a zip archive, each buffer gets its filename.
* Raw data, you need to do the serialization yourself.
* To verify the data: unzip data.zip && hexdump -C buf1 && hexdump -C buf2
*/
void f(const char* buf1, size_t buf1len, const char* buf2, size_t buf2len) {
std::ofstream ostr("data.zip", std::ios::binary);
Poco::Zip::Compress compress(ostr, true);
// Poco::MemoryInputStream is a zero-copy implementation of std::istream :-)
Poco::MemoryInputStream mis1(buf1, buf1len);
compress.addFile(mis1, Poco::DateTime(), "buf1");
Poco::MemoryInputStream mis2(buf2, buf2len);
compress.addFile(mis2, Poco::DateTime(), "buf2");
compress.close();
ostr.close();
}
int main() {
const char buf1[] = "binary\0buffer"; size_t buf1len = sizeof(buf1);
const char buf2[] = "BIN\0BUF"; size_t buf2len = sizeof(buf2);
try {
f(buf1, buf1len, buf2, buf2len);
return 0;
} catch (Poco::Exception& e) {
cout << e.displayText() << endl;
return -1;
}
}
私の意見では、POCO は素晴らしく、軽量で、モダンで、理解しやすい C++ ライブラリです。すぐに使いこなせるようになるでしょう。