【问题标题】:Decoding not working with Base64解码不适用于 Base64
【发布时间】:2017-03-30 22:02:08
【问题描述】:

对我的 URL 进行编码与 base-64 编码完美配合。解码也是如此,但不是字符串文字variable

这行得通:

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

这不是:

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

我做错了什么?什么都没有显示。但是如果我引用"tempvar",那么它当然可以工作,但不是一回事,因为"tempvar" 是一个字符串,而不是一个变量。

【问题讨论】:

  • 浏览器返回了一个异常。你有没有机会读过这条消息?

标签: javascript html encode


【解决方案1】:

您的问题

我做错了什么?

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

原因

根据 atob() 的 MDN 文档:

投掷

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

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

解决方案

一种解决方案是使用实际已编码的字符串(例如使用btoa())或至少长度为四(例如使用String.prototype.substring())。有关示例,请参见下面的 sn-p。

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> 

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

【讨论】:

  • 好吧,我的错。我的例子不是我面临的字面问题,它只是一个变量不能正常工作的例子。我的真实变量是“totalprice”,例如,当您单击一个将 totalprice 设置为 10 的按钮时,URL 将类似于:“transaction.html?totalprice=10”,这不起作用。它不知道什么是“totalprice=10”,但在base64encode.org 中它可以正常工作。很抱歉回复得太晚了,我遇到了一些问题,不能来这里开发我的脚本。感谢想法和想法?
  • 您是否尝试使用 atob() 进行编码?该函数用于解码...而不是使用 btoa() 来编码...
  • 是的,我用它来对 url 进行编码: 但在尝试解码时它不起作用。编辑:Idk​​ 但 btoa() 在该脚本中有效但 atob() 无效。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    这是因为您正在尝试解码非 base64 编码的字符串 它对 hi 起作用似乎只是一个巧合。

    atob = 解码

    btoa = 编码

    【讨论】:

      【解决方案4】:

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

      当您执行atob('hi') 时,您实际上是在解码“hi”,它恰好是有效的 base-64。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-13
        • 1970-01-01
        • 2017-06-11
        • 2016-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多