簡體   English   中英

將Java字節數組轉換為字符串

[英]Converting a java byte array to a String

我正在嘗試將Java字節數組轉換為String,如下所示:

byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr);

myFill()使用小於128個字符長的字符串填充byteArr,byteArr填充為零。 除了myString之外,代碼還不錯,可以將所有零填充轉換為一些難以辨認的字符。 myString.length()也返回128,而不是實際的ASCII內容。

我該如何糾正?

謝謝!

正如jtahlborn指出的那樣,Java字符串中的NUL(char = 0)沒有什么特別的-它只是另一個字符。 因此,(或至少一個)解決方案是在將源數據轉換為Java字符串時刪除多余的字符。

為此,請使用String構造函數重載 ,該重載采用數組offset / length和一個字符集:

byte[] byteArr = new byte[128];
myFill(byteArr);
String myString = new String(byteArr, 0, encodedStringLength, "US-ASCII");

然后,只需找出看起來像這樣的“ encodedStringLength”即可(當然,在填充byteArr之后):

int encodedStringLength = Arrays.asList(byteArr).indexOf(0);

當然,這不是“最有效”的方法,但是應該可以解決問題。 請記住,如果源字符串使用所有128個字節(例如,未以NUL終止),indexOf可能返回-1。

同樣, 通常應該(或也許總是)使用String-from-byte []構造函數指定一種字符編碼,因為“默認編碼”在運行時環境中可能會有所不同。 例如,如果默認編碼為UTF-16,則原始代碼也將嚴重破壞ASCII源數據。


或者,如果關心前導/尾隨空格或控制字符,則以下內容也可以工作(再次注意顯式字符編碼):

String myString = new String(byteArr, "US-ASCII").trim();

這是因為trim會刪除所有值小於或等於0x20(空格)的前導/結尾字符-包括NUL字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM