簡體   English   中英

解碼不適用於Base64

[英]Decoding not working with Base64

編碼我的URL可以與base-64編碼完美結合。 解碼也是如此,但不能使用字符串文字變量

這有效:

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

這不是:

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

我究竟做錯了什么? 什么都沒有顯示。 但是,如果我引用"tempvar" ,那么它當然可以工作,但由於"tempvar"是字符串而不是變量,所以不是同一回事。

這是因為它無法解碼字符串"hello" ,請嘗試可以從base64解碼的實際字符串。

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

如果要編碼,請改用btoa函數,

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

您可以使用此網站來測試對base64的解碼和編碼, https: //www.base64encode.org/

你的問題

我究竟做錯了什么?

傳遞給atob()的字符串是長度為5的字符串文字(從技術上講,不是基數為64的編碼字符串)。 瀏覽器控制台應在錯誤日志中顯示異常(請參見下面的原因中的說明)。

原因

根據atob()的MDN文檔:

投擲

拋出一個拋出:DOMException如果傳入的字符串的長度不是4的倍數1

字符串文字“ hello ”的長度(即5 )不是4的倍數。因此,拋出異常,而不是返回字符串文字的解碼版本。

一個解法

一種解決方案是使用實際上已編碼的字符串(例如,使用btoa() )或至少具有四個長度(例如,使用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> 


1 https://developer.mozilla.org/zh-CN/docs/Web/API/WindowOrWorkerGlobalScope/atob

這是因為您正在嘗試解碼在hi上工作的不是base64編碼的字符串,這似乎只是一個巧合。

atob =解碼

btoa =編碼

您使用了錯誤的功能。 您應該使用btoa()進行編碼。

當您執行atob('hi') ,實際上是在解碼'hi',它恰好是有效的base-64。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM