解码不能与Base64一起使用

时间:2017-03-30 22:02:09

标签: javascript html encode

编码我的URL与base-64编码完美配合。解码也是如此,而不是字符串文字变量

这有效:

document.write(atob("hi"));

这不是:

var tempvar = "hello";
document.write(atob(tempvar));

我做错了什么?没有显示任何内容。但是,如果我引用"tempvar",那么它当然有效,但不是一回事,因为"tempvar"是一个字符串,而不是一个变量。

4 个答案:

答案 0 :(得分:1)

因为它不能解码字符串"hello",尝试一下可以从base64解码的实际字符串,这是一个例子;

var tempvar = "aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MzEyOTEzNi9kZWNvZGluZy1ub3Qtd29ya2luZy13aXRoLWJhc2U2NA==";
document.write(atob(tempvar));

如果要进行编码,请改用btoa函数,

var tempvar = "hello";
document.write(btoa(tempvar));

您可以使用此网站测试解码和编码base64,https://www.base64encode.org/

答案 1 :(得分:1)

您的问题

  

我做错了什么?

传递给atob()的字符串是长度为5的字符串文字(技术上不是base-64编码的字符串)。浏览器控制台应在错误日志中显示异常(请参阅下面的 原因 中的说明)。

原因

根据atob()的MDN文档:

  

抛出

     

如果传入字符串的长度不是4的倍数,则抛出DOMException 1

字符串文字的长度" hello " (即 5 )不是4的倍数。因此抛出异常而不是返回字符串文字的解码版本。

解决方案

一种解决方案是使用实际已编码的字符串(例如,使用btoa())或至少具有4的长度(例如使用String.prototype.substring())。有关示例,请参阅下面的代码段。



var tempvar = "hello";
window.addEventListener("DOMContentLoaded", function(readyEvent) {
    var container = document.getElementById("container");
    //encode the string
    var encoded = btoa(tempvar); 
    container.innerHTML = encoded;

    var container2 = document.getElementById("container2"); 
    //decode the encoded string
    container2.innerHTML = atob(encoded);  
    
    var container3 = document.getElementById("container3");
    //decode the first 4 characters of the string
    container3.innerHTML = atob(tempvar.substring(0, 4));
});

<div> btoa(tempvar): <span id="container"></span></div> 
<div> atob(decoded): <span id="container2"></span></div>
<div> atob(tempvar.substring(0, 4)): <span id="container3"></span></div> 
&#13;
&#13;
&#13;

1 <子> https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/atob

答案 2 :(得分:0)

它是因为您正在尝试解码非base64编码的字符串 它的工作原理只是巧合而已。

atob = decode

btoa = encode

答案 3 :(得分:0)

您使用了错误的功能。您应该使用btoa()进行编码。

当您执行atob('hi')时,您实际上正在解码&#39; hi&#39;这恰好是有效的base-64。