nodejs 不支持 atob、btoa解决方案(Base64加解密、base64与uint8array转换)

浏览器等含有window对象处理base64的转换

// uint8array转为base64字符串
const uint8arrayToBase64 = function(u8Arr) {
     try{
          let CHUNK_SIZE = 0x8000; //arbitrary number
          let index = 0;
          let length = u8Arr.length;
          let result = '';
          let slice;
          while (index < length) {
              slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length));
              result += String.fromCharCode.apply(null, slice);
              index += CHUNK_SIZE;
          }
          // web image base64图片格式: "data:image/png;base64," + b64encoded;
          // return  "data:image/png;base64," + btoa(result);
          return btoa(result);
      }
      catch(e) {
          throw e;
      }
  }
// base64字符串转为uint8array数组
const base64ToUint8Array = function(base64String) {
     try{
         let padding = '='.repeat((4 - base64String.length % 4) % 4);
         let base64 = (base64String + padding)
             .replace(/\-/g, '+')
             .replace(/_/g, '/');
         let rawData = atob(base64);
         let outputArray = new Uint8Array(rawData.length);
         for (let i = 0; i < rawData.length; ++i) {
             outputArray[i] = rawData.charCodeAt(i);
         }
         return outputArray;
     }
     catch(e) {
         throw e;
     }
 }
// 判断是否json
const isJson = function(_str){
    if (typeof _str === 'string') {
        try {
            JSON.parse(_str);
            return true;
        } catch(e) {}
    }
    return false;
}
 // base64加密
const base64Encode = function(rawStr){
    if (typeof rawStr === 'undefined') {
        return null;
    }
    let result;
    try{
        result = btoa(unescape(encodeURIComponent(JSON.stringify(rawStr))));
    }
    catch(e) {
        throw e;
    }
    return result;
}
// base64解密
const base64Decode = function(base64Str){
    if (base64Str) {
        // 解密可能存在错误,所以需要try
        try{
            let parsedStr = decodeURIComponent(escape(atob(base64Str)));
            if (isJson(parsedStr)) {
                // 有的字符串不可以json恢复
                parsedStr = JSON.parse(parsedStr);
            }
            return parsedStr;
        } catch (e) {

        }
    }
    return null;
}

nodejs处理base64的转换

// uint8array转base64
const uint8arrayToBase64 = (value) => {
  // 必须定义 binary 二进制
  return Buffer.from(value, 'binary').toString('base64');
}

const base64ToUint8array = (value) => {
  value = Buffer.from(value, 'base64').toString('binary');
  let len = value.length;
  let outputArray = new Uint8Array(len);
  for (let i = 0; i < len; ++i) {
    outputArray[i] = value.charCodeAt(i);
  }
  return outputArray;
}

// 判断是否json
const isJson = function(_str){
    if (typeof _str === 'string') {
        try {
            JSON.parse(_str);
            return true;
        } catch(e) {}
    }
    return false;
}

// base64加密
const base64Encode = (value) => {
  if (typeof value === 'undefined') {
    return null;
  }
  return new Buffer(JSON.stringify(value), 'binary').toString('base64');
}

// base64解密
const base64Decode = (value) => {
  value = new Buffer(value, 'base64').toString('binary');
  if (isJson(value)) {
    value = JSON.parse(value);
  }
  return value;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值