java protobuf如何从int创建ByteString

Posted

技术标签:

【中文标题】java protobuf如何从int创建ByteString【英文标题】:java protobuf how to create ByteString from int 【发布时间】:2012-09-05 08:19:01 【问题描述】:

我想在我的项目中使用 google protobuf。

关键是我必须设置非常消息的第一个字节,因为底层代码根据第一个字节拒绝或接受消息并且它不知道 protobuf。

所以这个页面说 https://developers.google.com/protocol-buffers/docs/proto#scalar 我必须使用与 Java 中的 ByteString 对应的字节字段。

bytes 可以包含任意的字节序列。字符串字节串

但我不知道如何从 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 产生特定格式的字节,所以我不能指望字节类型的第一个字段成为消息的第一个字节 你考虑过写字节然后写协议缓冲区消息。正如 Nikolay 所说,Protocol-Buffers 控制着消息中写入的内容 【参考方案1】:
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);

【讨论】:

【参考方案2】:

将 protobuf 消息视为“黑盒”字节字符串。读取第一个字节后取出protobuf消息,然后处理protobuf部分。

创建一个字节缓冲区

Byte[] buf = new Byte[100]; //length as per your application

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

【讨论】:

【参考方案3】:

使用番石榴:

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

【讨论】:

以上是关于java protobuf如何从int创建ByteString的主要内容,如果未能解决你的问题,请参考以下文章

如何确定protobuf中的消息类型,以便我可以使用该类型.parsefrom(byte [])

JAVA:如何从 byte[] 创建 .PNG 图像?

java中int如何转换byte

如何在 Go 编程中将 []byte 转换为 int

java中int与byte相互转换

java中byte[]转换成int