什么是base64编码?
1、编码的字符串中,每个字符键码(Unicode键码)在[0-255]之间,超过此区间,会报错。如:"分".codePointAt() = 20998,对”分"字直接编码就会报错。
2、编码出来的字符串中,每个字符只能是 [a-z小写字母、A-Z大写字母、0-9阿拉伯数字、+、/、=] 这65个字符的其中之一。
base64 字符键码图
base64解码 转换 Unit8Array
function latin1ToUint8Array(str) {
const bytes = new Uint8Array(str.length);
for (let i = 0; i < bytes.length; i++) {
bytes[i] = str.charCodeAt(i);
}
return bytes;
}
base64编码 转换 blob
function base64ImageToBlob(base64) {
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < bytes.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
return new Blob([bytes], { type: 'image/png' });
}
base64转换原理
第一步,将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
第二步,将上面的24个二进制位每6个一组,共分为4组。
第三步,在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
第四步,根据Base64编码对照表(见下图)获得对应的值。
实现代码:
const createBase64 = (function() {
const getBitLen = (char) => [...char].map(i => {
// 获取unicode键码
let keyCode = i.codePointAt()
// 十进制键码转换二进制数
let binary = keyCode.toString(2)
// 获取二进制数有多少字节(8位一字节)
let byte = Math.ceil(binary.length / 8);
// 补足8位(1字节)的倍数
return binary.padStart(byte * 8, 0)
}).join("")
return function(char) {
// 获取base64键码对应的字符
let getChar = (index) => 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt(index)
// 获取二进制位数
let str = getBitLen(encodeURIComponent(char))
// 取二进制数中有多少个6位
let sixBitNum = Math.ceil(str.length / 6)
let array = []
for (let i = 0; i < sixBitNum; i++) {
// 取二进制数中每6位为一组,不足6位,在末尾补0,补足6位
let binary = str.slice(i * 6, (i + 1) * 6).padEnd(6, 0)
// 二进制数补足1字节
binary = binary.padStart(8, 0)
// 获取二进制数对应的十进制数
let decimal = parseInt(String(binary), 2)
// 获取base64键码对应的字符,放入数组
array.push(getChar(decimal))
}
// 获取base64字符长度为4的N呗
let charTimes = Math.ceil(array.length / 4)
// 填补0字节对应的等号
return array.join("").padEnd(charTimes * 4,"=")
}
})();
createBase64("你好呀")
浏览器中base64编码
// 将任意字符转换为Base64编码
function base64Encode(str){
return btoa(encodeURIComponent(str))
}
浏览器中base64解码
// 将Base64编码转换为原来的字符
function base64Decode(base64){
return decodeURIComponent(atob(base64))
}
Nodejs中base64编码
// base64编码
const encode = encodeURIComponent('nodejs中的base64编码')
const nodeBase64Encode = Buffer.from(encode).toString('base64')
Nodejs中base64解码
// base64解码
const nodeBase64decode = Buffer.from(base64Encode,'base64').toString()
const decode = decodeURIComponent(decode)