2013-11-25 31 views
1

我有一些從char數組轉換爲字節數組的代碼(不需要創建任何中間字符串,這是一個要求),我最終得到了一些最後的額外字節。下面是一些測試代碼,說明了這個問題:Java - 將char數組轉換爲字節數組 - 長度不匹配

String s = "TomJSawyer"; 

System.out.println("Original String length = " + s.length()); 

char[] caOrig = s.toCharArray(); 

System.out.println("Original Char Array Length = " + caOrig.length); 

byte[] ba1 = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig)).array(); 

System.out.println("byte array converted from char array length = " + ba1.length); 

byte[] ba2 = s.toString().getBytes("UTF-8"); 

System.out.println("byte array converted from String length = " + ba2.length); 

,這裏是上Winodows jdk160_24運行的輸出。

Original String length = 10 
Original Char Array Length = 10 
byte array converted from char array length = 11 
byte array converted from String length = 10 

使用字符集從char數組轉換而來的額外字節是零值。隨着輸入字符串變長,附加到字節數組末尾的零字節數量增加。我期望這與編碼有關,但它似乎是我指定UTF-8這兩個地方,所以我不知道這是爲什麼。

如果任何人都可以向我解釋發生了什麼事情或以其他方式指向正確的方向,我會非常感激。提前致謝。

回答

0

如果你沒有使用char[],你可以使用StringBuffer

StringBuffer sb = "TomJSawyer"; 

String.valueOf(sb).getBytes(); 
+0

StringBuffer sb =「TomJSawyer」; – MoMan

+2

謝謝你的想法。不幸的是,String.valueOf()創建了一箇中間字符串,這正是我試圖避免的。 – user2801442

5

documentation for CharsetEncoder.encode說:

返回: 包含結果的新分配的字節緩衝區的編碼操作。緩衝區的位置將爲零,並且其限制將在寫入的最後一個字節之後。

您錯誤地認爲ByteBuffer的整個支持陣列是有效的數據。您應該只查看ByteBuffer的limit以上的字節。事實上,CharsetEncoder.encode方法並不能保證返回的ByteBuffer甚至是一個數組的支持,所以你根本不應該調用array()

可靠的方法來讀出的字節緩衝區將是:

ByteBuffer buffer = Charset.forName("UTF-8").encode(CharBuffer.wrap(caOrig)); 
byte[] ba1 = new byte[buffer.limit()]; 
buffer.get(ba1); 
+0

謝謝VGR。這就是答案。對此,我真的非常感激。 – user2801442

+0

我是新來的網站。有什麼方法可以回答這個問題嗎? – user2801442

+0

從http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work:「要將答案標記爲已接受,請單擊答案旁邊的複選標記以將其從空白切換爲綠色(見下面的截圖)「 – VGR

0

字符數組大小與在許多場景中的字節數組的大小不同。當我在char數組中使用中文或日文字符時,它們不一樣。我只是修復了一個與我相關的應用程序中的錯誤。

下面是使用中國性格測試片段:

public static void main(String[] args) throws Exception { 
    char[] chars = new char[] { '中', '國' }; 
    System.out.println("string content: " + new String(chars)); 
    System.out.println("char array size: " + chars.length); 
    byte[] bytes = new String(chars).getBytes("UTF-8"); 
    System.out.println("byte array size: " + bytes.length); 
    System.out.println("converted string content: " + new String(bytes, "UTF-8")); 
} 

這裏是控制檯輸出:

string content: 中國 
char array size: 2 
byte array size: 6 
converted string content: 中國 

爲我做了,不要再犯同樣的錯誤。

相關問題