[英]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.