我有一个文件,其中包含常量大小(或者我希望如此)的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尽可能地缩小数据,根据它们的值打包整数 - 我怀疑它导致我的FrameData
对象的大小略有不同。
有没有办法强制protobuf使用常量字段大小?特别是针对int32?
(另一种选择是对所有字段使用bytes
类型,但我想避免这种情况)
答案 0 :(得分: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.