2013-08-07 28 views
2

我有一个固定长度的字节数组,我想在其中存储一个字符串。喜欢的东西:如何从固定长度的字节数组中存储和读取字符串?

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空终止的概念?)。我是否必须将字符串的长度存储在字节数组中,分别读出它以知道从字节数组中读取多少字节?

+1

为什么你从src'完全复制到'dst',而不是使用'src'本身? –

+1

是的,你应该存储你填入dst的字符串的长度,否则你将如何知道在再次从dst字节数组重新创建字符串时再次拉取多少字节。 – anubhava

+1

'new String(dst,0,src.length,“UTF-8”)''你可以使用没有字节的'DataOutputStream.writeUTF8(String)'。 –

回答

4

1. length​​场景

如果需要串字节存储到定制长度的数组,则可以使用第一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元素。但是不能保证你找到的第一个元素就是你需要的元素。

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​​场景。

+0

或者可以使用前面的1或2个字节来说明使用了多少个后续字节来表示长度的概念。这提供了一个更加可扩展的解决方案。 – Snps

+0

@Snps正确,这就是主意。 –

0

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

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

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首或更多个字节用于保持的长度您正在存储的数据。

相关问题