Base64 用 js 编码 解码 base64 完整代码

一、什么是Base64?

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。

由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。

三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。

 

在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同(本类库里面用的是`+`,`/`这两个字符)。

 

一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

 

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME, 在XML中存储复杂数据.

 

二、编码规则:

Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。

 

以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。

再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。

 

当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。

这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个 “=”。

 

Base64

 

三、实现的代码:

  1. //下面是64个基本的编码
  2. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  3. var base64DecodeChars = new Array(
  4.          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  5.          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  6.          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
  7.          52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
  8.          -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
  9.          15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
  10.         -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  11.         41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
  12. //编码的方法
  13. function base64encode(str) {
  14. var out, i, len;
  15. var c1, c2, c3;
  16.         len = str.length;
  17.         i = 0;
  18.         out = "";
  19. while(i < len) {
  20.         c1 = str.charCodeAt(i++) & 0xff;
  21. if(i == len)
  22.         {
  23.             out += base64EncodeChars.charAt(c1 >> 2);
  24.             out += base64EncodeChars.charAt((c1 & 0x3) << 4);
  25.             out += "==";
  26. break;
  27.         }
  28.         c2 = str.charCodeAt(i++);
  29. if(i == len)
  30.         {
  31.             out += base64EncodeChars.charAt(c1 >> 2);
  32.             out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
  33.             out += base64EncodeChars.charAt((c2 & 0xF) << 2);
  34.             out += "=";
  35. break;
  36.         }
  37.         c3 = str.charCodeAt(i++);
  38.         out += base64EncodeChars.charAt(c1 >> 2);
  39.         out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
  40.         out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
  41.         out += base64EncodeChars.charAt(c3 & 0x3F);
  42.         }
  43. return out;
  44.     }
  45. //解码的方法
  46. function base64decode(str) {
  47. var c1, c2, c3, c4;
  48. var i, len, out;
  49.         len = str.length;
  50.         i = 0;
  51.         out = "";
  52. while(i < len) {
  53. do {
  54.             c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
  55.         } while(i < len && c1 == -1);
  56. if(c1 == -1)
  57. break;
  58. do {
  59.             c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
  60.         } while(i < len && c2 == -1);
  61. if(c2 == -1)
  62. break;
  63.         out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
  64. do {
  65.             c3 = str.charCodeAt(i++) & 0xff;
  66. if(c3 == 61)
  67. return out;
  68.             c3 = base64DecodeChars[c3];
  69.         } while(i < len && c3 == -1);
  70. if(c3 == -1)
  71. break;
  72.         out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
  73. do {
  74.             c4 = str.charCodeAt(i++) & 0xff;
  75. if(c4 == 61)
  76. return out;
  77.             c4 = base64DecodeChars[c4];
  78.         } while(i < len && c4 == -1);
  79. if(c4 == -1)
  80. break;
  81.         out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
  82.         }
  83. return out;
  84.     }
  85. function utf16to8(str) {
  86. var out, i, len, c;
  87.         out = "";
  88.         len = str.length;
  89. for(i = 0; i < len; i++) {
  90.         c = str.charCodeAt(i);
  91. if ((c >= 0x0001) && (c <= 0x007F)) {
  92.             out += str.charAt(i);
  93.         } else if (c > 0x07FF) {
  94.             out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
  95.             out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
  96.            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
  97.        } else {
  98.            out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
  99.            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
  100.        }
  101.        }
  102. return out;
  103.    }
  104. function utf8to16(str) {
  105. var out, i, len, c;
  106. var char2, char3;
  107.        out = "";
  108.        len = str.length;
  109.        i = 0;
  110. while(i < len) {
  111.        c = str.charCodeAt(i++);
  112. switch(c >> 4)
  113.        {
  114. case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
  115. // 0xxxxxxx
  116.            out += str.charAt(i-1);
  117. break;
  118. case 12: case 13:
  119. // 110x xxxx   10xx xxxx
  120.            char2 = str.charCodeAt(i++);
  121.            out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
  122. break;
  123. case 14:
  124. // 1110 xxxx  10xx xxxx  10xx xxxx
  125.            char2 = str.charCodeAt(i++);
  126.            char3 = str.charCodeAt(i++);
  127.            out += String.fromCharCode(((c & 0x0F) << 12) |
  128.                           ((char2 & 0x3F) << 6) |
  129.                           ((char3 & 0x3F) << 0));
  130. break;
  131.        }
  132.        }
  133. return out;
  134.   }

 

调用方法:

  1. //编码
  2. value = base64encode(utf16to8(src))
  3. //解码
  4. value = utf8to16(base64decode(src))
    A+
发布日期:2017年08月11日  所属分类:javascript
最后修改时间:2017-08-11 15:37
评分: (当前没有评级)
付杰
wordpress discux dedecms 帝国 phpcms等快速建站服务
wordpress discux dedecms 帝国 phpcms等快速建站服务
  • ¥ 99.9元
  • 市场价:499.9元
PHP运行环境 Wamp Lamp Lnmp 安装、配置、搭建服务
PHP运行环境 Wamp Lamp Lnmp 安装、配置、搭建服务
  • ¥ 9.9元
  • 市场价:49.9元
wordpress站群服务 泛解析二级域名站群 二级目录站群
wordpress站群服务 泛解析二级域名站群 二级目录站群
  • ¥ 1999.9元
  • 市场价:4800元
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
  • ¥ 6.8元
  • 市场价:8.8元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: