有没有办法强制Protocol Buffer使用常量字段大小
Is there a way to force Protocol Buffer to use the constant field size?
我有一个文件,其中定义了大小不变(或者我希望如此)的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的值打包int——我怀疑这会导致我的FrameData
对象的大小略有不同。
有没有办法强迫质子束使用恒定的场大小?具体针对int32?
(另一种选择是对所有字段使用bytes
类型,但我希望避免这种情况)
如果您希望整数具有固定长度,可以使用相应的固定大小整数类型: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.
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- 列出常量和数组结构字段的初始化
- c++ 11统一初始化:字段初始化不是常量
- 为什么常量 POD 对象中的字段本身不是常量?
- 如何复制具有常量字段的成员
- 为什么这可以让我获得一个指向常量对象字段的非常量指针
- 有没有办法强制Protocol Buffer使用常量字段大小
- C++11 MinGW 4.9.1 shared_ptr和常量静态类字段结果"Undefined reference"