2017-07-06 282 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