如何在Byte Array Java中表示头值和实际消息
How to represent header value and actual message in Byte Array Java?
我需要制作一个字节数组,其中最初有头值,实际消息将出现在头值之后。
我的头值将有-data-center,它是一个字符串,client_id是整数,pool_id也是整数,data_count也是整数。
我的实际消息将在标头值之后出现-hello world
在我的情况下,我的标头长度可能会增加,所以我需要将其初始化为一个变量,以便以后根据需要增加它。
我对如何在这里使用字节数组有点困惑。我如何在网络字节顺序的字节数组中表示这一点,以便c++程序能够在ubuntu 12.04机器上正确解码?
您可以使用协议缓冲区来表示消息(标头和内容)。它将处理语言和不同平台之间的转换。此外,它还为进一步扩展和支持多个消息版本提供了空间。
对于您的示例,您可以定义如下消息格式(例如messageModel.proto):
package common;
option java_package = "my.java.package";
option java_outer_classname = "MessageProto";
message MyMessage {
optional string dataCenter = 1 [default = DEFAULT_DC];
optional int64 clientId = 2;
optional int64 poolId = 3;
optional int64 dataCount = 4;
optional string body = 5;
}
然后使用protoc
编译类似:
protoc -I src/java/ --java_out=src/java/ messageModel.proto
您将生成传输对象和实用程序类,以便将它们从一个端点封送到另一个端点(甚至表示不同的消息)。有关更多详细信息,请查看java教程。
要从java创建MyMessage
,您可以执行以下操作:
MessageProto.MyMessage.Builder mb = MessageProto.MyMessage.newBuilder();
mb.setDataCenter("aDC");
mb.setClientId(12);
mb.setPoolId(14);
mb.setDataCount(2);
mb.setbody("hello world");
MessageProto.MyMessage message = mb.build();
要将消息转换为字节数组,您将使用:message.toByteArray()
如果C++/C
是您的目的地,您将需要(从同一模型)生成C
构建器和对象。要解码消息,您将执行以下操作:
MessageProto.MyMessage message = MessageProto.MyMessage.parseFrom(buffer);
其中buffer
将表示所接收的内容。
如果这只是一个家庭作业,那么您可以使用DataOutputStream
,但我建议也研究协议缓冲区。
尝试使用针对ByteArrayOutputStream
的DataOutputStream
。将消息写入DataOutputStream后,可以从ByteArrayOutputStream获得构造的字节数组。
像这样:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(client_id);
dos.writeUTF(data_center);
// etc...
byte[] message = baos.toByteArray();
如果您想要更大的灵活性和更高的性能,协议缓冲区也是一个不错的选择。这取决于你想从这个应用程序中得到什么;如果它需要更高的性能,或者它是一次性的一次性应用程序,还是你希望在更长的将来增长和维护的东西。DataOutputStream和DataInputStream使用简单,您可以立即开始,您需要投入更多的时间来学习协议缓冲区。
- 表示"accepting anything for this template argument" C++概念的通配符
- boost::进程间消息队列引发错误
- 如何将ampl中的集合表示为c++中的向量
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- std::is_base_of表示ctor编译错误
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- c++模板来表示多项式
- 如何通过参数抛出错误消息
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- 从服务器传输到客户端的消息不会出现
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- ROS2 动态消息模板
- 如何在Byte Array Java中表示头值和实际消息
- 异常消息:插入错误值的字符串表示
- 消息包-如何查找表示的字符串