在Java中给字节数组赋值

5

我有一个字节数组,想要按照以下方式进行赋值:

  • 第一个字节指定字符串的长度:(byte)string.length()
  • 第二个到最后一个字节包含从string.getBytes()获取的字符串数据

除了使用for循环之外,是否有一种快速的方法可以使用来自两个不同变量的字节初始化字节数组?


2
你能保证你的字符串长度始终小于256个字符吗?如果不考虑符号位,长度是否小于128个字符? - Anon
2
在Java中,字节是带符号的值。当转换为int时,它们将被扩展符号位。因此,您必须屏蔽扩展符号位以获取范围0..255:b&0xFF - Anon
2
@R Bernrose - 真的吗?那Java语言规范是错的吗?http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.1 - Anon
@Anon 我正在将一个字符串转换为比特流,用于隐写术。当我将我的比特流转换回字节数组时,是否会遇到问题,以便再次获取我的字符串? - fredley
@Anon:是的,但在这种情况下不需要。有时候我希望你可以删除/隐藏评论。 - Mark Peters
显示剩余4条评论
4个回答

6
你可以使用System.arrayCopy()来复制字节:
String x = "xx";
byte[] out = new byte[x.getBytes().length()+1];
out[0] = (byte) (0xFF & x.getBytes().length());
System.arraycopy(x.getBytes(), 0, out, 1, x.length());

虽然像其他人建议的使用ByteArrayOutputStreamByteBuffer这样的东西可能是更清晰的方法,并且从长远来看会更好 :-)


2
这可能比使用库类来处理这个简单的操作更简单。一个评论是,当转换为字节时,(0xFF & ...) 操作是完全多余的。(byte) 强制转换以相同的方式截断。只有在返回整数时才需要关注。 - Mark Peters
好的,同意。我在想,安全第一,对吧?;-) - Guss

2

有关 ByteBuffer 的情况如何?

示例:

    ByteBuffer bb = ByteBuffer.allocate(string.getBytes().length +1 );
    bb.put((byte) string.length());
    bb.put(string.getBytes());

2
这是正确的方法,但需要一些注释。首先,在盲目转换为“byte”之前,需要检查字符串的长度。其次,应该使用带有字符集的String.getBytes()变体。 - Anon
@Anon同意你的评论 +1 :) @fredley如果你在关注,请注意这个。 - jmj
2
能够包含获取原帖要求的字节数组代码将是很好的。 - Mark Peters

2

虽然ByteBuffer通常是构建字节数组的最佳方式,但考虑到OP的目标,我认为以下方法会更加健壮:

public static void main(String[] argv)
throws Exception
{
   String s = "any string up to 64k long";

   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   DataOutputStream out = new DataOutputStream(bos);
   out.writeUTF(s);
   out.close();

   byte[] bytes = bos.toByteArray();

   ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
   DataInputStream in = new DataInputStream(bis);

   String s2 = in.readUTF();
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接