Ove*_*olt 0 java binary parsing protocol-buffers
我有一个程序,用Java中的Protobuf序列化数据,在byte [] Array中写入二进制数据,然后将其保存在".txt"文件中.我在字符串流中接收C++端的数据.现在我想用C++解析那个二进制数据,但是Protobuf-Parsing-Method"parseFromString()"不起作用!我的测试消息中的字段未设置.我为此写了一个小测试,我可以给你看一些代码:
Java序列化
byte[] s = test.build().toByteArray(); //This is serialized to "C:\test.txt" as binary
Run Code Online (Sandbox Code Playgroud)
C++解析:
Test t1; // My Protobuf Message
std::ifstream myFile("C:\\test.txt");
std::string s;
myFile >> s;
t1.ParseFromString(s);
std::cout << "Decoded: " << t2.s() << std::endl; // Check if parsing was correct
Run Code Online (Sandbox Code Playgroud)
但它只是返回:"解码:",好像t2是空的,但它不应该!如何用C++解析二进制数据?
你的问题可能在这里:
myFile >> s;
Run Code Online (Sandbox Code Playgroud)
该>>
运营商读取文本字符串,用空格分隔.编码的protobuf不是文本.可能ParseFromString()
是返回false表示它无法解析数据,因为它不完整.
你想要做的是阅读整个文件.在您的情况下,最简单的方法是使用ParseFromIstream(&myFile)
.(并确保检查它是否返回true!)
(另一个选择是检查文件大小,创建一个大小的数组,使用myFile.read(array, size)
,然后ParseFromArray(array, size)
,但这将是更多的工作,将做同样的事情.)
请注意,您可能不应将其.txt
用作protobuf的文件扩展名,因为该文件不包含文本.
另请注意,令人困惑的是,在C++中,您可以将二进制(非文本)数据放入std::string
- 它只是一个字节容器 - 但在Java中,您不能将二进制数据放入String
.所以C++ ParseFromString()
和SerializeAsString()
处理二进制数据,而Java toString()
实际上返回消息的文本表示(用于调试目的),这不是你想要传输的.
归档时间: |
|
查看次数: |
1711 次 |
最近记录: |