2017-07-06 221 views
0

我在试图序列化unsigned charGZIP压缩文件时使用protobuf压缩文件的问题,当玩图书馆。Protobuf与GZIP压缩

我认为这个问题可能与我的一些语法或API的滥用有关。 我也试过std::fstream。 仅供参考,Windows 8.1 & VS2013是建筑环境。

scene.proto

syntax = "proto3"; 

package Recipe; 

message Scene 
{ 
    repeated int32 imageData = 1 [packed=true]; 
} 

source.cpp

#include <iostream> 
#include <fstream> 
#include <ostream> 
#include <istream> 
#include <string> 
#include <cstdint> 
#include "Scene.pb.h" 
#include <google\protobuf\io\zero_copy_stream_impl.h> 
#include <google\protobuf\io\gzip_stream.h> 

int const _MIN = 0; 
int const _MAX = 255; 
unsigned int const _SIZE = 65200000; 
unsigned int const _COMPRESSION_LEVEL = 10; 

void randWithinUnsignedCharSize(uint8_t * buffer, unsigned int size) 
{ 
    for (size_t i = 0; i < size; ++i) 
    { 
     buffer[i] = _MIN + (rand() % static_cast<int>(_MAX - _MIN + 1)); 
    } 
} 

using namespace google::protobuf::io; 

int main() 
{ 
    GOOGLE_PROTOBUF_VERIFY_VERSION; 

    Recipe::Scene * scene = new Recipe::Scene(); 
    uint8_t * imageData = new uint8_t[_SIZE]; 
    randWithinUnsignedCharSize(imageData, _SIZE); 

    for (size_t i = 0; i < _SIZE; i++) 
    { 
     scene->add_imagedata(imageData[i]); 
    } 
    std::cout << "scene->imagedata_size() " << scene->imagedata_size() << std::endl; 
    { 
     std::ofstream output("scene.art", std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); 
     OstreamOutputStream outputFileStream(&output); 
     GzipOutputStream::Options options; 
     options.format = GzipOutputStream::GZIP; 
     options.compression_level = _COMPRESSION_LEVEL; 

     GzipOutputStream gzipOutputStream(&outputFileStream, options); 

     if (!scene->SerializeToZeroCopyStream(&gzipOutputStream)) { 
      std::cerr << "Failed to write scene." << std::endl; 
      return -1; 
     } 
    } 
    Recipe::Scene * scene1 = new Recipe::Scene(); 
    { 
     std::ifstream input("scene.art", std::ifstream::in | std::ifstream::binary); 
     IstreamInputStream inputFileStream(&input); 
     GzipInputStream gzipInputStream(&inputFileStream); 

     if (!scene1->ParseFromZeroCopyStream(&gzipInputStream)) { 
      std::cerr << "Failed to parse scene." << std::endl; 
      return -1; 
     } 
    } 
    std::cout << "scene1->imagedata_size() " << scene1->imagedata_size() <<std::endl; 
    google::protobuf::ShutdownProtobufLibrary(); 
    return 0; 
} 

回答

1

你似乎有代码中的错字。压缩级别根​​据documentation在0-9范围内。

unsigned int const _COMPRESSION_LEVEL = 9; 
+0

您好,感谢了很多:你当校正到正确的压缩级别设置为10

你的例子是为我工作。有用。谢谢指出。 – vincent911001