尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误

Posted

技术标签:

【中文标题】尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误【英文标题】:"The string to be decoded is not correctly encoded " error when trying to decode Base64 in JS which has been encoded in Java 【发布时间】:2019-05-21 11:54:22 【问题描述】:

我在尝试将一些数据从 Java 传递到 JS 时遇到问题。 原始数据的类型为byte[]

在我使用的 Java 端:

byte[] data = some_data;
return Base64.getEncoder().withoutPadding().encodeToString(data)

在我尝试使用的 JS 方面:

atob(b64Data)

当我这样做时,我遇到了该主题的错误:

DOMException: 无法在 'Window' 上执行 'atob': 字符串 解码未正确编码。

注意:删除 .withoutPadding() 会产生相同的结果。

我的问题是,如何返工代码让错误不再出现?

【问题讨论】:

你的问题是什么? 你在 javascript 中的b64Data 是什么?当你打印/记录它时你看到了什么?你是怎么收到的? 编码问题? 我正在使用 SockJS 通过 WebSocket 上的 STOMP 发送数据。该数据是具有超过 40M 个字符的 excel 文件的二进制文件。我可以尝试查看文件的开头是否显示了某些内容,但我认为这些数据应该从 Java 服务器“按原样”发送。 你能不能同时编码简单的字符串?您的代码看起来正确,所以问题可能出在数据中(太长) 【参考方案1】:

看来问题出在 Spring 端通过 WebSocket/SockJS 的 STOMP 客户端,而不是编码数据本身。

虽然数据是从带有签名的方法发送的 public String getDataForExcelFile 通过 WebSocket 得到的结果如下所示:

FrameImpl command, headers, ack, binaryBody, body, (...) 所以而不是 atob(b64Data)我需要使用atob(b64Data.body)

【讨论】:

以上是关于尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误的主要内容,如果未能解决你的问题,请参考以下文章

js前端Java后台编码解码

关于前台js编码后台java解码

Java 和 JS/AS3 之间 URL 解码/编码 UTF-8 的差异(错误!?)

Java后台URL转码-Js编码和Java后台解码

确定正确的解码技术

JS编解码与Java编解码