java数据类型到字节数组

标签 java bytebuffer indexoutofboundsexception

我有一个 Java 类

public class MsgLayout{
int field1;
String field2;
long field3;
}

我必须将此对象写为 Socket 输出流中的字节数组。这三个字段(实例变量)有一个布局。即field1必须占用1个字节,field2必须占用4个字节,field3必须占用8个字节。

ByteBuffer bbf = ByteBuffer.allocate(TOTAL_SIZE);
bbf.put(Integer.toString(this.getField1()).getBytes(), 0, FIELD1_SIZE);
bbf.position(FIELD2_OFFSET);
bbf.put(Long.toString(this.getField2()).getBytes(), 0, FIELD2_SIZE);
bbf.position(FIELD3_OFFSET);
bbf.put(Long.toString(this.getField3()).getBytes(), 0, FIELD3_SIZE);
byte[] msg = bbf.array();

使用上面的代码,我试图根据所需的大小来适应字节数组中的每个字段。但是我收到了 IndexOutOfBoundException 简而言之,问题在于如何使字段适应布局定义的大小。例如 FIELD1_OFFSET = 0、FIELD1_SIZE=1、FIELD2_OFFSET=1、FIELD2_SIZE=4、FIELD3_OFFSET=5、FIELD3_SIZE=8。 现在,当我将 field1 转换为 String 时,它在转换为 byte[] 时不适合 1 个字节。如果我不转换为字符串,而是使用 putInt(int),它会将 4 个字节写入生成的字节数组。

最佳答案

您的代码当前正在做的是将您的数字字段编码为字符串,然后输出这些字符的字节。

我建议使用 DataOutputStream 类来包装您的 SocketOutput 流并这样编写您的二进制数据:

DataOutput output = new DataOutputStream(socketOutputStream);

int field1 = 1;
String field2 = "Hello";
long field3 = 5000000000L;

output.writeByte(field1);
output.writeBytes(field2.substring(0, 3));
output.writeLong(field3);

这段代码中有几个假设。首先,我假设对于字段 2,您希望将 4 个字符分别序列化为一个字节。如果您想使用 UTF-8 之类的东西进行任何多字节编码,那么您需要做一些不同的事情。其次,我假设字段 2 总是至少有 4 个字符。

关于java数据类型到字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584652/

相关文章:

java - 使用 Bytebuffer 写出返回不同于简单写出

java - 我有一个 IndexOutOfBoundsException 并且不明白为什么

java - 数组中的 For 循环 (Java) 索引越界

java - 使用 B-Tree 索引 <String, Arraylist<Integer>>

java - 如何在 Java 中更新现有文件?

java - 按下按钮并在java中的新窗口中打开文件

java - 我可以将 ZODB 与 Hibernate/JPA 一起使用吗?

android - 如何确定 UsbRequest.queue(..) 方法接收字节的长度?

arrays - D - 是否有用于读取和写入字节的字节缓冲区?