我使用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。我真的很难过:(
答案 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")));