2013-08-07 79 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首或更多個字節用於保持的長度您正在存儲的數據。

相關問題