2012-01-12 19 views
24

如何創建從一個字節數組如何將具有空終止字符的字節數組轉換爲Java中的字符串?

byte arr[MAX_SIZE]; // Java 

其中陣列元件中的一個是C空終止字節字符串對象?是否如調用一樣簡單

String str = new String(arr); 

是否知道字符串構造函數會自動停止在空終止字符?空字節之後的任何字節都是(可能)垃圾字符,我不想將其包含在字符串中。根據Parsing byte array containg fields of unknown length的最後一個響應建議在數組中循環並手動查找空終止字符,但我想知道String構造函數是否會自動執行此操作。我還假設系統的默認字符集將用於所有目的。

回答

21
byte arr[] = ... 
Charset charset = ... 
int i; 
for (i = 0; i < arr.length && arr[i] != 0; i++) { } 
String str = new String(arr, 0, i, charSet); 

注:

  • 它一般是使用顯式的字符集參數,使您的應用程序不依賴於平臺的一個好主意默認字符集/編碼。

  • 這對某些字符集不起作用。例如,UTF-16編碼的字符串不能安全地表示爲零終止的字節序列,因爲許多代碼單元包含零字節。 (在另一方面,UTF-8 OK提供的字符串不包含代碼點零的情況下;見Can UTF-8 contain zero byte?

...但我想知道的String構造是否會自動執行此操作。

沒有它/他們不會。 (不要「奇怪」......閱讀javadoc :-))

我還假設系統的默認字符集將用於所有的目的。

如果不指定字符集,將使用Java平臺的默認值。這很可能是系統的默認設置,但不能保證。

4

它不會神奇地停在空終止符。空字符不會在Java中終止字符串。你必須找到第一個空字符的索引並在那裏停下來。之後使用String(byte[] arr, int offset, length)構造函數。

+1

的NULL字符不一定朝陣列的結尾;它可以在任何位置。 – Phillip 2012-01-12 22:29:17

+0

@BenS no,arr.length - 1 – sjr 2012-01-12 22:29:59

+0

@Phillip,在再次閱讀您的問題後意識到這一點。編輯我的答案 – sjr 2012-01-12 22:30:16

8

這個怎麼樣:

String str = new String(arr).split("\0")[0]; 
+4

如果輸入數組很大,看起來不太好,除非您要讀取所有字符串。 – sjr 2012-01-12 22:31:53

9

嘗試: 的String =新字符串(ARR).trim()

+0

這不起作用 – picoworm 2017-02-16 09:32:13

+0

trim()刪除我的字符串末尾的空字符就好... – 2017-02-27 22:58:57

+0

trim()也解決了我的問題。 – 2017-09-26 17:09:36

相關問題