无法让我的base64字符串在我的javascript客户端上解码

时间:2014-08-27 19:54:49

标签: java javascript utf-8 websocket base64

我使用WebSocket从我的java tomcat服务器向我的浏览器发送数据。我收到错误:" Uncaught InvalidCharacterError:' atob'失败:要解码的字符串未正确编码。"

这是我的代码:

(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端看起来像这样:[B@74193bd0[B@24a6103c

如果重要的话,我正在使用org.glassfish.jersey.internal.util.Base64。我真的很难过:(

2 个答案:

答案 0 :(得分:2)

  

我的base64字符串在java和javascript端看起来像这样:[B@74193bd0[B@24a6103c

那不是base64。这是在两个字节数组上调用toString()的结果的串联。您正在使用返回byte[]的方法,而不是字符串,这意味着您的字符串连接不合适。您可以使用Base64.encodeAsString - 或完全使用其他base64库(例如the iharder one)。但实际上你不应该进行任何字符串连接。

您的generateImageString代码 已完全损坏。你完全不清楚为什么要将整数转换为字符串,获取UTF-8表示形式,然后将字节数组转换为base64 ...然后在循环中执行此操作。这不是获得任何有意义的方式。

我怀疑你实际上应该从byte[]而不是int[]开始 - 它不清楚这些值是什么意思 - 但是您想要Base64.encode进行次来电,并传递byte[]。如果您正在调用Integer.toString或连接Base64数据,那么您就是&#39做错了。

答案 1 :(得分:-1)

[B @ 24a6103c将字节数组表示为字符串,因为Base64.encode返回一个字节数组。

在将字节数组连接到字符串base64Image

之前,需要将字节数组转换为字符串

我想你想这样做:

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