四时宝库

程序员的知识宝库

啥?Base64?不止64(啥?Base64?不止64位区别)

什么是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)

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接