【问题标题】:Cannot get my base64 string to decode on my javascript client无法在我的 javascript 客户端上解码我的 base64 字符串
【发布时间】:2014-10-21 13:16:26
【问题描述】:

我正在使用 WebSocket 将数据从我的 java tomcat 服务器发送到我的浏览器。我收到错误:“未捕获的 InvalidCharacterError: 'atob' failed: 要解码的字符串未正确编码。”

这是我的代码:

(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。我真的很难过:(

【问题讨论】:

    标签: java javascript utf-8 websocket base64


    【解决方案1】:

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

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

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

    我怀疑你应该实际上byte[] 而不是int[] 开头 - 不清楚这些值是什么意思 - 但你想要一个 single 调用Base64.encode,将byte[] 传入。如果你调用Integer.toString 或连接Base64 数据位,那么你做错了。

    【讨论】:

    • 是否可以从 int[] 到 byte[] 再到 base64 字符串,然后在 javascript 端反转它?我没有意识到我离我有多远......
    • @smuggledPancakes:是的,这完全有可能——但您需要确定如何将int[] 映射到byte[],例如就字节顺序而言。
    【解决方案2】:

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

    你需要先将字节数组转换为字符串,然后再连接到String base64Image

    我想你想这样做:

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

    【讨论】:

    • 不,这绝对是不是 OP应该做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2012-07-10
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多