我需要用混合数据类型构造一个Java字节数组,但我不知道如何做到这一点。这些是我的类型:
byte version = 1; // at offset 0
short message_length = // the size of the byte[] message I am constructing here, at offset 1
short sub_version = 15346; // at offset 3
byte message_id = 2; // at offset 5
int flag1 = 10; // at offset 6
int flag2 = 0; // at offset 10
int flag3 = 0; // at offset 14
int flag4 = 0; // at offset 18
String message = "the quick brown fox jumps over the lazy dog"; // at offset 22
我知道String,我可以使用
message.getBytes("US_ASCII");
我知道int值,我可以使用
Integer.byteValue();
我知道短值,我可以使用
Short.byteValue();
字节值已经是字节,我只是不确定如何将所有这些组合成单个字节数组。我读过关于
的文章System.arraycopy();
这是正确的过程,我只是将所有数据转换为字节,并开始使用arraycopy“连接”字节数组?
我正在与一些我无法控制的远程服务器进行通信,这是他们需要的消息处理。
答案 0 :(得分:2)
围绕DataOutputStream
包裹ByteArrayOutputStream
。通过这种方式,您可以将int
和short
等所有原始类型直接写入DataOutputStream
,将ByteArrayOutputStream
转换为字节并将其转发到ByteArrayOutputStream bOut = new ByteArrayOutputStream();
DataOutputStream dOut = new DataOutputStream(bOut);
dOut.writeByte(version);
dOut.writeShort(message_length);
dOut.writeShort(sub_version);
dOut.writeByte(message_id);
dOut.writeInt(flag1);
dOut.writeInt(flag2);
dOut.writeInt(flag3);
dOut.writeInt(flag4);
dOut.write(message.getBytes(), 0, message.length());
dOut.flush();
byte[] result = bOut.toByteArray();
,您可以从中DataInputStream
然后将整个事物检索为一个字节数组:
ByteArrayInputStream
关于这一点最好的事情是你可以使用{{1}}和{{1}}完全相反(从字节数组中提取值)完全类似于上面的代码。
答案 1 :(得分:1)
如果是混合型'你的意思是一个具有不同成员字段类型的类,然后一种方法是创建类serializable,并使用ApacheUtils
byte[] data = SerializationUtils.serialize(yourObject);
答案 2 :(得分:0)
答案 3 :(得分:0)
所有,我想在这里发布我自己的解决方案。我在how to insert a short into java byte array上进行了快速Google搜索。其中一个结果谈到了Java ByteBuffer。经过一番阅读,我确定这是我获得所需结果的最佳和最快捷方式。 Java API中的一个让我对ByteBuffer感兴趣的部分就是:
指定此类中没有返回值的方法,以返回调用它们的缓冲区。这允许链接方法调用。陈述序列
bb.putInt(0xCAFEBABE);
bb.putShort(3);
bb.putShort(45);
例如,可以用单个语句替换
bb.putInt(0xCAFEBABE).putShort(3).putShort(45);
所以,这就是我所做的:
byte version = 1;
short message_length = 72;
short sub_version = 15346;
byte message_id = 2;
int flag1 = 10;
int flag2 = 0;
int flag3 = 0;
int flag4 = 0;
String message = "the quick brown fox jumps over the lazy dog";
ByteBuffer messageBuffer = ByteBuffer.allocate(message_length);
messageBuffer.put(version).putShort(message_length).putShort(sub_version).put(message_id).putInt(flag1).putInt(flag2).putInt(flag3).putInt(flag4).put(message.getBytes());
byte[] myArray = messageBuffer.array();
这很快捷,而且正是我所需要的。感谢所有花时间阅读和回复的人。