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的主要内容,如果未能解决你的问题,请参考以下文章