4

我有一个固定长度的字节数组,我想在其中存储一个字符串。就像是:

byte[] dst = new byte[512];
String foo = "foo";
byte[] src = foo.getBytes("utf-8");

for (int i = 0; i < src.length; i++) {
    dst[i] = src[i];
}

但是当我想从 dst 中读回字符串值时,无法知道字符串的终止位置(猜想 java 中没有空终止符的概念?)。我是否必须将字符串的长度存储在字节数组中,单独读出以知道要从字节数组中读取多少字节?

4

3 回答 3

6

1. length+payload场景

如果您需要将字符串字节存储到自定义长度数组中,那么您可以使用前 1 或 2 个字节来表示“长度”的概念。

代码如下所示:

byte[] dst = new byte[256];
String foo = "foo";
byte[] src = foo.getBytes("utf-8");
dst[0] = src.length;
System.arraycopy(src, 0, dst, 1, src.length);

2.0元素场景

或者您可以检查数组,直到找到一个0元素。但是不能保证0您找到的第一个元素就是您需要的元素。

byte[] dst = new byte[256];
String foo = "foo";
byte[] src = foo.getBytes("utf-8");
System.arraycopy(src, 0, dst, 0, src.length);
int length = findLength(dst);

private int findLength(byte[] strBytes) {
    for(int i=0; i< dst.length; ++i) {
        if (dst[i] == 0) {
            return i;
        }
    }
    return 0;
}

我的选择:

我个人会选择length+payload场景。

于 2013-08-07T16:34:05.040 回答
0

您可以使用修改后的 UTF-8编码对字符串进行编码。这样您就可以使用 0 作为终止符。

但是,如果可能的话,你应该坚持更直接的方法。

于 2013-08-07T16:42:59.813 回答
0

我建议ByteArrayOutputStream用于保存数据和数据长度。一个简单的例子:

ByteArrayOutputStream dst = new ByteArrayOutputStream();
String foo = "foo";
byte[] src = foo.getBytes("utf-8");
dst.write(src.length); // write length
dst.write(src); // write data

测试:

byte[] tmp = dst.toByteArray(); // length+data
byte[] newsrc = new byte[tmp[0]]; // tmp[0] is length
System.arraycopy(tmp, 1, newsrc, 0, tmp[0]); // copy data without length
System.out.println("Result str => " + new String(newsrc, "utf-8")); // create String again
//=> Result str => foo 

PS:这是一个简单的示例,对于实际数据处理,最好保留 2 个或更多字节来保存您存储的数据的长度。

于 2013-08-07T16:45:23.847 回答