Почему zcat генерирует «недопустимые сжатые данные» при распаковке файла, сжатого с помощью GzipOutputStream? - PullRequest
1 голос
/ 02 марта 2020

В 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 это имя файла.

...