2016-07-20 25 views
0

は、私はここで定義された一定の大きさ(またはので、私が望んで)いるProtobufメッセージとファイルがあります:プロトコルバッファに定数フィールドサイズを使用させる方法はありますか?

message FrameData { 
    required int32 index = 1; 
    required bytes timeStamp = 2; 
    required int32 timeStampSize = 3; 
    required bytes frame = 4; 
    required int32 frameSize = 5; 
} 

ファイルが数百人いるProtobufメッセージが含まれているが、すべてのフレームは、常に同じサイズでなければなりません。しかし、私がファイルを読み込むと、通常、indexに広いダイナミックレンジがあるときに、データが破損することがあります。

Protobufは可能な限りデータを縮小し、その値に基づいてintをパックします。私のFrameDataオブジェクトのサイズが少し違うと思われます。

protobufに一定のフィールドサイズを使用させる方法はありますか?特にint32?

(別のオプションは、すべてのフィールドのbytesタイプを使用することですが、私はそれを避けたいのですが)

+0

私は理解できない、プロトコルの伝送の「他の側を」? –

+0

はい。メッセージはファイルに保存され、反対側はそのファイルから読み込まれます。 Protobufは読み込んだストリームを消費するため、Protobufの各メッセージを手動で読み込み、protobufで解析する必要があります。使用の純粋さではない... – Nitay

答えて

2

あなたが整数の長さを固定しているしたい場合は、対応する固定サイズの整数型を使用することができますint32を - >sfixed32,uint32 - >fixed32など。

しかし、シリアル化されたprotobufメッセージの長さを「推測」するのは良い考えではないと思います。代わりに、長さをファイルに保存する必要があります。例えば:

FILE *fp = fopen("data", "w"); 
FrameData frame; 
string serialized; 
frame.SerializeToString(&serialized); 
// write length first 
size_t length = serialized.size(); 
fwrite(reinterpret_cast<const char*>(&length), sizeof(length), 1, fp); 
// then write the serialized data 
fwrite(serialized.c_str(), 1, serialized.size(), fp); 
// write other protobuf messages 

ファイル解析:「手動」解析さ

FILE *fp = fopen("data", "r"); 
size_t length = 0; 
// read length first 
fread(&length, sizeof(length), 1, fp); 
// then read serialized data 
char *buf = new char[length]; 
fread(buf, length, 1, fp); 
// Parse protobuf 
FrameData frame; 
frame.ParseFromArray(buf, length); 
// read other messages. 
+0

お返事ありがとうございます!私は実際にサイズを保存していますが、フレームインデックス値が変わるとフレームごとに変わります。 – Nitay

関連する問題