如何在Byte Array Java中表示头值和实际消息

How to represent header value and actual message in Byte Array Java?

本文关键字:消息 表示 Byte Array Java      更新时间:2023-10-16

我需要制作一个字节数组,其中最初有头值,实际消息将出现在头值之后。

我的头值将有-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,但我建议也研究协议缓冲区。

尝试使用针对ByteArrayOutputStreamDataOutputStream。将消息写入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使用简单,您可以立即开始,您需要投入更多的时间来学习协议缓冲区。