gpt4 book ai didi

c++ - 有没有办法强制 Protocol Buffer 使用恒定的字段大小?

转载 作者:行者123 更新时间:2023-11-28 02:03:26 35 4
gpt4 key购买 nike

我有一个文件,其中定义了固定大小(或者我希望如此)的 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 类型,但我想避免这种情况)

最佳答案

如果希望整数具有固定长度,可以使用对应的固定大小的整数类型: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.

关于c++ - 有没有办法强制 Protocol Buffer 使用恒定的字段大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38480741/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com