为什么btoa不能转换回base64字符串?
let b64 = "abc123"
console.log(btoa(atob(b64))); //abc12w==
字符串末尾发生了什么?
我将图像存储在 localStorage 中作为 DataURI,它基本上是带有标头的 Base64 字符串。两者都只使用 7 位 ASCII。为了填充未使用的位(字符串有 16 位)和一半的长度,我创建了这些函数,这似乎在 btoa 上出现错误:
function compress(dataURI_or_base64) { // 8-bit to 16-bit string (get half length)
var bin = atob(dataURI_or_base64.substr(dataURI_or_base64.indexOf(',')+1)); //remove header
var len = bin.length;
var arr = new Uint8Array(new ArrayBuffer(len));
for (var i = 0; i < len; i++) arr[i] = bin.charCodeAt(i);
return new TextDecoder('utf-16').decode(arr);
}
function decompress(str, mimeType) { // 16-bit to 8-bit string (get back)
var arr = new Uint8Array(str.length * 2), i = j = 0;
while (i < str.length) {
var cc = str.charCodeAt(i++)
arr[j++] = cc & 0xff;
arr[j++] = cc >> 8;
}
var bin = '', i = 0;
while (i < arr.byteLength) bin += String.fromCharCode(arr[i++]);
let dataURI = 'data:' + mimeType + ';base64,'
return (mimeType? dataURI: "") + window.btoa(bin);
}
btoa(atob(b64))
有什么奇怪的,我们可以让它工作(使其可逆)吗?
atob_rev(atob(b64)) === b64 //true. How to make atob_rev() to replace btoa?
未找到有用的答案(2023.07.30):
使用atob和btoa函数从base64进行javascript编码和解码
注意必须首先使用
atob
,因为btoa
给出了更长的字符串,但是atob
变得更短,可以通过将其变成16位字符串进一步减半,所以任何带有btoa
的答案
第一个错了!