【问题标题】:java data types to byte arrayjava数据类型转字节数组
【发布时间】:2011-11-26 22:22:13
【问题描述】:

我有一个 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 转换为字符串时,当转换为字节 [] 时,它不适合 1 字节。如果我不转换为字符串,并使用 putInt(int) 它将 4 个字节写入结果字节数组。

【问题讨论】:

  • 除非你能保证你的字段的范围,否则当你试图将它们存储到缓冲区中太小的固定大小的槽中时,你会丢失数据。你打算如何解决这个问题?
  • 范围是什么意思?我不能将整数放在一个字节中吗?我不能以 4 个字节存储一个字符串吗?
  • @hoshang.varshney,Java 中的 int 不是 4 个字节,String 是可变长度的。当您说字符串时,您是在考虑一个字符,即单个字符吗?在 Java 中,由于使用 unicode,即使单个字符也占用 2 个字节。
  • 我指的是字符串(可变长度)。我想我必须将 field2 的最大长度保持为 4 以适应消息。

标签: java bytebuffer indexoutofboundsexception


【解决方案1】:

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

我建议使用 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 个字符。

【讨论】:

    【解决方案2】:

    field1 可能只有一个字节的数据,但它的字符串表示将是一个或多个字符(例如"0""63""127")。 String 中的每个字符实际上都是一个char(一个两个字节的值)。所以我希望一个字节的数据在经过 byte->String->byte[] 转换时会膨胀到 2 到 6 个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      相关资源
      最近更新 更多