我有一个固定长度的字节数组,我想在其中存储一个字符串。类似的东西:
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中没有null终止符的概念?)。我是否必须在字节数组中存储字符串的长度,单独读出以知道从字节数组中读取多少字节?
答案 0 :(得分:5)
<强> 1。 length
+ payload
广告
如果需要将字符串字节存储到自定义长度数组中,则可以使用前1或2个字节作为“length”的概念。
代码如下:
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
方案。
答案 1 :(得分:0)
您可以使用Modified UTF-8编码对字符串进行编码。这样你可以使用0作为终结符。
但是,如果可能的话,你应该坚持更直接的方法。
答案 2 :(得分: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个或更多字节来保存您正在存储的数据的长度。