Java Protobuf如何从int创建ByteString

3
我希望在我的项目中使用Google Protobuf。
问题是,由于底层代码基于第一个字节接受或拒绝消息,并且它不知道protobuf,所以我必须设置每个消息的第一个字节。
因此,这个页面https://developers.google.com/protocol-buffers/docs/proto#scalar说我必须使用与Java中的ByteString对应的bytes字段。

bytes可以包含任意字节序列。string ByteString

但我不知道如何从int值创建ByteString。我已经尝试了这种方式:
ByteBuffer eventTypeBuffer = ByteBuffer.allocate(1);
eventTypeBuffer.put(0x1c);
ByteString eventType = ByteString.copyFrom(eventTypeBuffer);
System.out.println(eventType.size() + " " + eventTypeBuffer.array().length);

Header.Builder mh = Header.newBuilder();
mh.setEventType(eventType);

不能正常工作,println输出0 1


似乎protobuf生成特定格式的字节,因此我不能期望类型为bytes的第一个字段成为消息的第一个字节。 - Nikolay Kuznetsov
你考虑过先编写Byte,然后再编写Protocol-buffer消息吗?正如Nikolay所说,Protocol-Buffers控制消息中的内容。 - Bruce Martin
3个回答

4
ByteBuffer eventTypeBuffer = ByteBuffer.allocate(1);
eventTypeBuffer.put(0x1c);
eventTypeBuffer.flip();
ByteString eventType = ByteString.copyFrom(eventTypeBuffer);
System.out.println(eventType.size() + " " + eventTypeBuffer.array().length);

Header.Builder mh = Header.newBuilder();
mh.setEventType(eventType);

3
考虑protobuf消息为一个“黑盒”字节串。读取第一个字节后,获取protobuf消息并处理它。
创建一个字节缓冲区。
Byte[] buf = new Byte[100]; //length as per your application

然后根据您的应用程序(根据第一个字节拒绝或接受消息)给出第一个字节。您可以使用protobuf消息填充其余的字节。


0

使用 Guava:

ByteString byteStringFromInt(int in) {
  return ByteString.copyFrom(Ints.toByteArray(in));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接