2014-08-27 21 views
0

我正在使用WebSocket將數據從我的java tomcat服務器發送到我的瀏覽器。我得到錯誤:「Uncaught InvalidCharacterError:'atob'failed:要解碼的字符串編碼不正確。」無法讓我的base64字符串在我的JavaScript客戶端解碼

這裏是我的代碼:

(Java服務器代碼):

public void open(Session session) 
{ 
    String base64ImageString = generateImageString(); 
    try 
    { 
    session.getBasicRemote().sendText(base64ImageString); 
    } 
    catch(IOException e) 
    { 
    e.printStackTrace(); 
    } 
} 

private String generateImageString() 
{ 
    int imageData[] = new int[2]; 
    imageData[0] = 255; 
    imageData[1] = 128; 
    String base64Image = ""; 
    for(int i = 0; i < imageData.length; i++) 
    { 
    try 
    { 
     base64Image += Base64.encode(Integer.toString(imageData[i]).getBytes("UTF8")); 
     catch (UnsupportedEncodingException e) 
    } 
    catch(UnsupportedEncodingException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
    return base64Image; 
} 

(JavaScript代碼):

function onMessage(evt) 
{ 
    base64ImageDataString = evt.data; 
    imageDataString = window.atob(base64ImageDataString); 
} 

我的base64字符串看起來像在Java和JavaScript側:[[email protected][[email protected]

我使用org.glassfish.jersey.internal.util.Base64如果它事項。我真的難倒:(

回答

2

My base64 string looks like this on the java and javascript side: [[email protected][[email protected]

那不是的base64,這就是呼籲兩個字節數組toString()結果的串聯。您使用它返回一個byte[]的方法,而不是一個字符串,這意味着你的字符串串聯是不合適的,您可以使用Base64.encodeAsString - 。或完全使用不同的base64庫(如the iharder one)不過說真的,你不應該做任何字符串連接

generateImageString代碼徹底打破這不是在所有。清楚爲什麼你要將一個整數轉換爲一個字符串,得到UT F-8表示,然後將字節數組轉換爲base64 ...,然後在循環中執行該操作。這不是獲得任何有意義的方法。

我懷疑你應該實際上byte[]而不是int[]首發 - 目前還不清楚是什麼這些值都意味着是 - 但是你想有一個調用Base64.encode,路過byte[]的如果。你打電話Integer.toString或連接Base64數據的位,你做錯了。

+0

是否有可能從int []以字節去[]到一個base64字符串,然後在JavaScript端反向?我沒有意識到我有多遠... – smuggledPancakes 2014-08-27 20:17:56

+0

@smuggledPancakes:是的,這完全有可能 - 但是你需要弄清楚你想如何將int []映射到'byte []',就字節順序而言。 – 2014-08-27 20:18:30

-1

[B @ 24a6103c由於Base64.encode返回一個字節數組,因此將字節數組表示爲一個字符串。

你需要它串聯到字符串base64Image

我認爲你要做到這一點之前的字節數組轉換爲字符串:

base64Image += new String(Base64.encode(Integer.toString(imageData[i]).getBytes("UTF8"))); 
+0

不,這絕對*不* OP應該做什麼。 – 2014-08-27 20:18:49