我使用谷歌protobuffer进行数据反序列化,但我的问题是嵌套结构的字段值没有设置。我在十六进制编辑器中检查了bin文件,值看起来很好。但是,由于我的嵌套结构中的第一个字段是浮点数,如果我尝试获取相应的字节数并将其解码为浮点数,则该值似乎很好。
有人可以建议我还能做些什么来检查这个或者可能发生了什么?我也尝试过使用ParseFromIstream。
原型文件是:
syntax = "proto3";
package generatedata;
message DataSample {
DataSample_Safe DataSafe = 1;
uint32 PassReSts = 2;
uint32 Dir = 3;
}
message DataSample_Safe {
float ALast = 1;
uint32 ALastQf = 2;
}
message DataSampleMultiple
{
repeated DataSample finaldata = 1;
}
C ++代码是
fstream in("test.bin", ios::in | ios::binary);
generatedata::DataSample test_data;
while(in.read((char *) &test_data,sizeof(test_data)))
{
const generatedata::DataSample_Safe& veh = test_data.datasafe();
cout << "safe" << veh.alast() << endl;
cout << "First " << test_data.passrests() << endl;
cout << "Second " << test_data.dir() << endl;
}
使用ParseFromIstream,代码是
generatedata::DataSampleMultiple test_data;
test_data.ParseFromIstream(&in);
for(int i = 0 ; i < test_data.finaldata_size(); i ++)
{
const generatedata::DataSample& veh = test_data.finaldata(i);
const generatedata::DataSample_Safe& check = veh.datasafe();
cout << "safe" << check.alast() << endl;
cout << "First " << veh.passrests() << endl;
cout << "Second " << veh.dir() << endl;
}
在上述情况下使用ParseFromIstream,最终数据大小为0
第一个cout给出了分段错误,因为尚未设置safe的值。但是,使用istream :: read
时,第二个和第三个cout正确输出