客户端发送一个1481字节的数组。
服务器可以毫无问题地读取所有1481字节的消息,但是通过从接收到的二进制数组中解析给定的消息,我得到了这个例子:

com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).

二进制数据是相同的。我检查了我是否使用了正确的原始文件版本。我有点不知所措。任何帮助表示赞赏。



byte [] data= IOUtils.toByteArray(br1, "ASCII");System.out.println("SIZE:" + data.length);
AddressBook adb1 = AddressBook.parseFrom(data); System.out.println("Server: Addressbook:" + adb1.getPersonCount()); System.out.println("Server: Addressbook:" + adb1.getPerson(0).getName());


题:

我需要找到一种从读取的1481个字节的arry正确解析收到的Adressbook消息的方法。

谢谢。

最佳答案

这就是问题:

br1 = new InputStreamReader(s.getInputStream());


试图将不透明的二进制数据视为文本。它不是文本,而是二进制数据。因此,当您将该Reader转换为字节数组时,就会丢失大量原始数据-难怪它是无效的协议缓冲区。

只需使用:

AddressBook adb1 = AddressBook.parseFrom(s.getInputStream());


并避免有损文本转换。当然,这是假设您在C#方面还没有遇到同样的问题。

如果必须通过文本,则应在两侧都使用base64编码。

10-05 22:13