是否可以用btoa制作可逆的atob?

问题描述 投票:0回答:0

为什么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 不可逆

使用atob和btoa函数从base64进行javascript编码和解码

注意必须首先使用

atob
,因为
btoa
给出了更长的字符串
,但是
atob
变得更短,可以通过将其变成16位字符串进一步减半,所以任何带有
btoa的答案
第一个错了!

base64 local-storage compression data-uri btoa
© www.soinside.com 2019 - 2024. All rights reserved.