前言
在某些场景下,我们经常需要创建一个 base-64 编码的字符串,在 js 中可以直接使用 window.btoa()
方法来实现,但是在微信小程序中并没有 window 对象,所以可以自己实现一个 btoa() 方法。
实现
btoa
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var b64re =
/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
exports.mpBtoa = function (string) {
string = String(string);
var bitmap,
a,
b,
c,
result = "",
i = 0,
rest = string.length % 3;
for (; i < string.length; ) {
if (
(a = string.charCodeAt(i++)) > 255 ||
(b = string.charCodeAt(i++)) > 255 ||
(c = string.charCodeAt(i++)) > 255
)
throw new TypeError(
"Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."
);
bitmap = (a << 16) | (b << 8) | c;
result +=
b64.charAt((bitmap >> 18) & 63) +
b64.charAt((bitmap >> 12) & 63) +
b64.charAt((bitmap >> 6) & 63) +
b64.charAt(bitmap & 63);
}
return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result;
};
atob
"use strict";
exports.mpAtob = function (string) {
string = String(string).replace(/[\t\n\f\r ]+/g, "");
if (!b64re.test(string))
throw new TypeError(
"Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."
);
string += "==".slice(2 - (string.length & 3));
var bitmap,
result = "",
r1,
r2,
i = 0;
for (; i < string.length; ) {
bitmap =
(b64.indexOf(string.charAt(i++)) << 18) |
(b64.indexOf(string.charAt(i++)) << 12) |
((r1 = b64.indexOf(string.charAt(i++))) << 6) |
(r2 = b64.indexOf(string.charAt(i++)));
result +=
r1 === 64
? String.fromCharCode((bitmap >> 16) & 255)
: r2 === 64
? String.fromCharCode((bitmap >> 16) & 255, (bitmap >> 8) & 255)
: String.fromCharCode(
(bitmap >> 16) & 255,
(bitmap >> 8) & 255,
bitmap & 255
);
}
return result;
};
小程序中使用
- 新建 mp.js 文件,新增函数 mpBtoa、mpAtob github
- 引入
import { mpBtoa, mpAtob } from "./mp.js";