В C ++ я использую GzipOutputStream
для сжатия данных, что является большой строкой. Сначала я должен преобразовать строку в прототипное сообщение, например:
syntax = "proto3";
package Serverlog_Compress;
message ServerlogMessage {
string data = 1;
}
Затем в коде я вызываю GzipOutputStream
для сжатия данных, например:
google::protobuf::io::GzipOutputStream::Options options_;
options_.format = google::protobuf::io::GzipOutputStream::GZIP;
options_.compression_level = 9;
google::protobuf::io::FileOutputStream file_stream(fd);
google::protobuf::io::GzipOutputStream gzip_stream(&file_stream, options_);
auto *message = butil::get_object<Serverlog_Compress::ServerlogMessage>();
message->set_data(data);
int ret = 0;
{
std::lock_guard<std::mutex> lock(file_mutex_);
ret = message->SerializeToZeroCopyStream(&gzip_stream);
}
if (!ret) {
LOG(ERROR) << "Failed to write the message, the ret is " << ret;
message->Clear();
butil::return_object(message);
return -1;
}
message->Clear();
butil::return_object(message);
После того, как я завершил sh сжатие, я получил файл сжатых данных, но когда я использовал zcat
для получения данных файла, я получил эту ошибку:
gzip: 20200301_12: invalid compressed data--crc error
gzip: 20200301_12: invalid compressed data--length error
20200301_12
это имя файла.