js实现标准的Base64编码解码

Base64 是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀

;(function(global) {//int转bytefunction int2Byte(i) {var b = i & 0xFF; //[0-255]var c = 0;if (b >= 0x80) {c = b % 0x80;c = -1 * (0x80 - c);} else {c = b;}return c;}//字符串转byte[]function str2Bytes(str) {var ch, stack, result = [];for (var i = 0, len = str.length; i < len; i++) {ch = str.charCodeAt(i);stack = []; if (ch >= 0x010000 && ch <= 0x10FFFF) {stack.push(int2Byte(((ch >> 18) & 0x07) | 0xF0));stack.push(int2Byte(((ch >> 12) & 0x3F) | 0x80));stack.push(int2Byte(((ch >> 6) & 0x3F) | 0x80));stack.push(int2Byte((ch & 0x3F) | 0x80));} else if (ch >= 0x000800 && ch <= 0x00FFFF) {stack.push(int2Byte(((ch >> 12) & 0x0F) | 0xE0));stack.push(int2Byte(((ch >> 6) & 0x3F) | 0x80));stack.push(int2Byte((ch & 0x3F) | 0x80));} else if (ch >= 0x000080 && ch <= 0x0007FF) {stack.push(int2Byte(((ch >> 6) & 0x1F) | 0xC0));stack.push(int2Byte((ch & 0x3F) | 0x80));} else {stack.push(ch & 0xFF);}result = result.concat(stack);}return result;}//byte[]转stringfunction bytes2Str(_arr) {var unicodeStr = '';for (var pos = 0, len = _arr.length; pos < len;) {var flag = _arr[pos];var unicode = 0;if ((flag >>> 7) === 0) {unicodeStr += String.fromCharCode(_arr[pos]);pos += 1;} else if ((flag & 0xF0) === 0xF0) {unicode = (_arr[pos] & 0xF) << 18;unicode |= (_arr[pos + 1] & 0x3F) << 12;unicode |= (_arr[pos + 2] & 0x3F) << 6;unicode |= (_arr[pos + 3] & 0x3F);unicodeStr += String.fromCodePoint(unicode);pos += 4;} else if ((flag & 0xE0) === 0xE0) {unicode = (_arr[pos] & 0x1F) << 12;;unicode |= (_arr[pos + 1] & 0x3F) << 6;unicode |= (_arr[pos + 2] & 0x3F);unicodeStr += String.fromCharCode(unicode);pos += 3;} else if ((flag & 0xC0) === 0xC0) {unicode = (_arr[pos] & 0x3F) << 6;unicode |= (_arr[pos + 1] & 0x3F);unicodeStr += String.fromCharCode(unicode);pos += 2;} else {unicodeStr += String.fromCharCode(_arr[pos]);pos += 1;}}return unicodeStr;}var toBase64 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'];var fromBase64 = new Array();for (var i = 0, len = 256; i < len; i++) {fromBase64[i] = -1;}for (var j = 0; j < toBase64.length; j++) {fromBase64[toBase64[j].charCodeAt(0)] = j;}fromBase64['='.charCodeAt(0)] = -2;//base64编码 string return byte[]function _encodeBase64(src) {src = src || '';var bsrc = str2Bytes(src);var end = bsrc.length;var off = 0;var dst = [];var base64 = [];for (var i = 0, len = toBase64.length; i < len; i++) {base64[i] = toBase64[i].charCodeAt(0);}var sp = off;var slen = Math.trunc((end - off) / 3) * 3;var sl = off + slen;var dp = 0;while (sp < sl) {var sl0 = Math.min(sp + slen, sl);for (var sp0 = sp, dp0 = dp; sp0 < sl0;) {var bits = (bsrc[sp0++] & 0xff) << 16 | (bsrc[sp0++] & 0xff) << 8 | (bsrc[sp0++] & 0xff);dst[dp0++] = int2Byte(base64[(bits >>> 18) & 0x3f]);dst[dp0++] = int2Byte(base64[(bits >>> 12) & 0x3f]);dst[dp0++] = int2Byte(base64[(bits >>> 6) & 0x3f]);dst[dp0++] = int2Byte(base64[bits & 0x3f]);}var dlen = (sl0 - sp) / 3 * 4;dp += dlen;sp = sl0;}if (sp < end) {var b0 = bsrc[sp++] & 0xff;dst[dp++] = int2Byte(base64[b0 >> 2]);if (sp == end) {dst[dp++] = int2Byte(base64[(b0 << 4) & 0x3f]);dst[dp++] = '='.charCodeAt(0);dst[dp++] = '='.charCodeAt(0);} else {var b1 = bsrc[sp++] & 0xff;dst[dp++] = int2Byte(base64[(b0 << 4) & 0x3f | (b1 >> 4)]);dst[dp++] = int2Byte(base64[(b1 << 2) & 0x3f]);dst[dp++] = '='.charCodeAt(0);}}return dst;}//base64解码 string return byte[]function _decodeBase64(src) {src = (src || '').replace(/[^A-z0-9+/]/g, '');var bsrc = str2Bytes(src);var sl = bsrc.length;var sp = 0;var dst = [];var base64 = fromBase64;var dp = 0;var bits = 0;var shiftto = 18; while (sl > sp) {var b = bsrc[sp++] & 0xff;if ((b = base64[b]) < 0) {if (b == -2) { break;}}bits |= (b << shiftto);shiftto -= 6;if (shiftto < 0) {dst[dp++] = int2Byte(bits >> 16);dst[dp++] = int2Byte(bits >> 8);dst[dp++] = int2Byte(bits);shiftto = 18;bits = 0;}}if (shiftto == 6) {dst[dp++] = int2Byte(bits >> 16);} else if (shiftto == 0) {dst[dp++] = int2Byte(bits >> 16);dst[dp++] = int2Byte(bits >> 8);}return dst;}global.BASE64 = {decodeBase64: _decodeBase64,encodeBase64: _encodeBase64,strToBytes: str2Bytes,bytesToString: bytes2Str};
})(window);

如何使用:

var en = BASE64.encodeBase64("js实现Base64编码解码");
console.log(en);//[97, 110, 80, 108, 114, 112, 55, 110, 106, 114, 66, 67, 89, 88, 78, 108, 78, 106, 84, 110, 118, 74, 98, 110, 111, 73, 72, 111, 112, 54, 80, 110, 111, 73, 69, 61]
var enStr = BASE64.bytesToString(en);
console.log(enStr); //anPlrp7njrBCYXNlNjTnvJbnoIHop6PnoIE=
var de = BASE64.decodeBase64(enStr);
console.log(de);//[106, 115, -27, -82, -98, -25, -114, -80, 66, 97, 115, 101, 54, 52, -25, -68, -106, -25, -96, -127, -24, -89, -93, -25, -96, -127]
var deStr = BASE64.bytesToString(de);
console.log(deStr);//js实现Base64编码解码

js实现Base64编码解码相关推荐

  1. Vue项目:路由跳转时中文传参被URL编码,怎么解决?用js封装Base64编码解码加密解密

    1.在utils中封装js方法,代码如下: var Base64 = { ​// private property_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZab ...

  2. js base64 编码解码

    js base64 编码解码 encode decode,可以直接使用 function Base64() {// private property_keyStr = "ABCDEFGHIJ ...

  3. 原来浏览器原生支持JS Base64编码解码

    原来浏览器原生支持JS Base64编码解码 转载来源:https://www.zhangxinxu.com/wordpress/2018/08/js-base64-atob-btoa-encode- ...

  4. js实现base64编码和解码

    文章目录 需求 什么是Base64 编码规则 如何解码 js实现基于base64的编码解码 window自带函数进行Base64编码解码 Base64编码的实际运用 图片base64编码 需求 应公司 ...

  5. js编码java解码_常用的js、java编码解码方法

    前言 前后端直接传输数据进行交互不就行了吗,为什么还要进行编码解码?正常情况下直接交互没问题,但当有类似以下情况出现时就需要进行编码再进行传输: 1.编码格式难以统一,导致数据交互过程出现中文乱码等问 ...

  6. python使用base64编码解码数据

    python使用base64编码解码数据 base64模块是用来作base64编码解码,常用于小型数据的传输.编码后的数据是一个字符串,其包括a-z.A-Z.0-9./.+共64个字符,即可用6个字节 ...

  7. java svgbase64转byte_java 图片进行base64 编码解码

    java 图片进行base64 编码解码 刘振兴 代码分享 2017年06月07日 10555 2条评论 import sun.misc.BASE64Decoder; import sun.misc. ...

  8. openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...

  9. Java工程中引用Base64编码解码小记

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一. Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两 ...

最新文章

  1. Mac 技术篇-Oracle数据库官方连接工具SQL Developer的安装与连接演示
  2. volatile可以保证原子性吗
  3. centos删除php_centos如何卸载php
  4. surface php老是用不了,surface pro7触摸屏没反应怎么办
  5. “刺激的”2017双11 阿里安全工程师首度揭秘智能风控平台MTEE3
  6. java保留小数点后几位,不足的用0补
  7. CSDN资源下载积分规则
  8. NoSQL数据库知识
  9. 下载mysql驱动jar包教程
  10. ps制作计算机考试证件照,证件照电子版怎么弄-利用PS制作证件照的简单小教程,可以直接拿去打印了...
  11. IIR滤波器与FIR滤波器的对比
  12. Mac上有哪些好用的写作软件?四类写作软件总有一款适合你!
  13. python怎么变成白色_在python中将一系列颜色更改为白色
  14. VCS建立仿真生成DVE波形
  15. Macbook Pro(无法完全)通过序列号与激活时间辨别是否为翻新机
  16. 达人评测:i5-1135g7相当于什么水平-i5-1135g7是低压吗
  17. C语言讲义——链表的实现
  18. 3.字符设备驱动高级
  19. 架构 | 新一代分布式数据库架构详解
  20. 轩辕剑--资料集(四)

热门文章

  1. (转)中国IP业的尴尬处境,IP业务的难点
  2. LINUX 删除redis的key
  3. ABAP小游戏:消灭星星Pop star
  4. 格力明年要用上自家的芯片?这似乎有点脱离现实
  5. 【外挂编程】外挂编程技术揭秘(二)
  6. Span使用之系统提供的Span基本样式
  7. Android 多渠道打包 签名
  8. 1 奥运排行榜 (25分)
  9. 电脑怎么录屏带声音?录屏软件哪个好?
  10. Web of Lies(图论/入度)