Javascript base64编码实现代码


Posted in Javascript onDecember 02, 2011
/* 
* base64编码 
*/ 
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
var base64DecodeChars = new Array( 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 

52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, 

-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 

15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, 

-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 

41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); 
function base64encode(str) { 

var out, i, len; 

var c1, c2, c3; 

len = str.length; 

i = 0; 

out = ""; 

while(i < len) { 
c1 = str.charCodeAt(i++) & 0xff; 
if(i == len) 
{ 
out += base64EncodeChars.charAt(c1 >> 2); 

 out += base64EncodeChars.charAt((c1 & 0x3) << 4); 

 out += "=="; 

 break; 
} 
c2 = str.charCodeAt(i++); 
if(i == len) 
{ 

 out += base64EncodeChars.charAt(c1 >> 2); 

 out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 

 out += base64EncodeChars.charAt((c2 & 0xF) << 2); 

 out += "="; 

 break; 
} 
c3 = str.charCodeAt(i++); 
out += base64EncodeChars.charAt(c1 >> 2); 
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); 
out += base64EncodeChars.charAt(c3 & 0x3F); 

} 

return out; 
} 
function base64decode(str) { 

var c1, c2, c3, c4; 

var i, len, out; 

len = str.length; 

i = 0; 

out = ""; 

while(i < len) { 
/* c1 */ 
do { 

 c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; 
} while(i < len && c1 == -1); 
if(c1 == -1) 

 break; 
/* c2 */ 
do { 

 c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; 
} while(i < len && c2 == -1); 
if(c2 == -1) 

 break; 
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); 
/* c3 */ 
do { 

 c3 = str.charCodeAt(i++) & 0xff; 

 if(c3 == 61) 
  return out; 

 c3 = base64DecodeChars[c3]; 
} while(i < len && c3 == -1); 
if(c3 == -1) 

 break; 
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); 
/* c4 */ 
do { 

 c4 = str.charCodeAt(i++) & 0xff; 

 if(c4 == 61) 
  return out; 

 c4 = base64DecodeChars[c4]; 
} while(i < len && c4 == -1); 
if(c4 == -1) 

 break; 
out += String.fromCharCode(((c3 & 0x03) << 6) | c4); 

 } 

return out; 
} 
function utf16to8(str) { 

var out, i, len, c; 

out = ""; 

len = str.length; 

for(i = 0; i < len; i++) { 
c = str.charCodeAt(i); 
if ((c >= 0x0001) && (c <= 0x007F)) { 

 out += str.charAt(i); 
} else if (c > 0x07FF) { 

 out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); 

 out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); 

 out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); 
} else { 

 out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); 

 out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); 
} 

} 

return out; 
} 
function utf8to16(str) { 

var out, i, len, c; 

var char2, char3; 

out = ""; 

len = str.length; 

i = 0; 

while(i < len) { 
c = str.charCodeAt(i++); 
switch(c >> 4) 
{ 
  case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: 

 // 0xxxxxxx 

 out += str.charAt(i-1); 

 break; 
  case 12: case 13: 

 // 110x xxxx  10xx xxxx 

 char2 = str.charCodeAt(i++); 

 out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); 

 break; 
  case 14: 

 // 1110 xxxx 10xx xxxx 10xx xxxx 

 char2 = str.charCodeAt(i++); 

 char3 = str.charCodeAt(i++); 

 out += String.fromCharCode(((c & 0x0F) << 12) | 


((char2 & 0x3F) << 6) | 


((char3 & 0x3F) << 0)); 

 break; 
} 
} 

return out; 
} 
/* 
* base64编码 End 
*/ 
var m = 'hello'; 
m = base64encode(m);

这是一个例子:
<HTML> 
<HEAD> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<TITLE>Javascript Base64 Demo</TITLE> 
<script language=javascript> 
/* 
* base64编码 
*/ 
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
var base64DecodeChars = new Array( 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 

52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, 

-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 

15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, 

-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 

41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); 
function base64encode(str) { 

var out, i, len; 

var c1, c2, c3; 

len = str.length; 

i = 0; 

out = ""; 

while(i < len) { 
c1 = str.charCodeAt(i++) & 0xff; 
if(i == len) 
{ 
out += base64EncodeChars.charAt(c1 >> 2); 

 out += base64EncodeChars.charAt((c1 & 0x3) << 4); 

 out += "=="; 

 break; 
} 
c2 = str.charCodeAt(i++); 
if(i == len) 
{ 

 out += base64EncodeChars.charAt(c1 >> 2); 

 out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 

 out += base64EncodeChars.charAt((c2 & 0xF) << 2); 

 out += "="; 

 break; 
} 
c3 = str.charCodeAt(i++); 
out += base64EncodeChars.charAt(c1 >> 2); 
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); 
out += base64EncodeChars.charAt(c3 & 0x3F); 

} 

return out; 
} 
function base64decode(str) { 

var c1, c2, c3, c4; 

var i, len, out; 

len = str.length; 

i = 0; 

out = ""; 

while(i < len) { 
/* c1 */ 
do { 

 c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; 
} while(i < len && c1 == -1); 
if(c1 == -1) 

 break; 
/* c2 */ 
do { 

 c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; 
} while(i < len && c2 == -1); 
if(c2 == -1) 

 break; 
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); 
/* c3 */ 
do { 

 c3 = str.charCodeAt(i++) & 0xff; 

 if(c3 == 61) 
  return out; 

 c3 = base64DecodeChars[c3]; 
} while(i < len && c3 == -1); 
if(c3 == -1) 

 break; 
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); 
/* c4 */ 
do { 

 c4 = str.charCodeAt(i++) & 0xff; 

 if(c4 == 61) 
  return out; 

 c4 = base64DecodeChars[c4]; 
} while(i < len && c4 == -1); 
if(c4 == -1) 

 break; 
out += String.fromCharCode(((c3 & 0x03) << 6) | c4); 

 } 

return out; 
} 
function utf16to8(str) { 

var out, i, len, c; 

out = ""; 

len = str.length; 

for(i = 0; i < len; i++) { 
c = str.charCodeAt(i); 
if ((c >= 0x0001) && (c <= 0x007F)) { 

 out += str.charAt(i); 
} else if (c > 0x07FF) { 

 out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); 

 out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); 

 out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); 
} else { 

 out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); 

 out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); 
} 

} 

return out; 
} 
function utf8to16(str) { 

var out, i, len, c; 

var char2, char3; 

out = ""; 

len = str.length; 

i = 0; 

while(i < len) { 
c = str.charCodeAt(i++); 
switch(c >> 4) 
{ 
  case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: 

 // 0xxxxxxx 

 out += str.charAt(i-1); 

 break; 
  case 12: case 13: 

 // 110x xxxx  10xx xxxx 

 char2 = str.charCodeAt(i++); 

 out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); 

 break; 
  case 14: 

 // 1110 xxxx 10xx xxxx 10xx xxxx 

 char2 = str.charCodeAt(i++); 

 char3 = str.charCodeAt(i++); 

 out += String.fromCharCode(((c & 0x0F) << 12) | 


((char2 & 0x3F) << 6) | 


((char3 & 0x3F) << 0)); 

 break; 
} 
} 

return out; 
} 
/* 
* base64编码 End 
*/ 
function doit() { 

var f = document.f 

f.output.value = base64encode(utf16to8(f.source.value)) 

f.decode.value = utf8to16(base64decode(f.output.value)) 
} 
</script> 
</HEAD> 
<BODY> 
<H1>Javascript Base64 Demo</H1> 
<FORM NAME="f"> 
原码<BR> 
<TEXTAREA NAME="source" ROWS=4 COLS=80 WRAP="soft"></TEXTAREA><BR><BR> 
Base64 encode<BR> 
<TEXTAREA NAME="output" ROWS=4 COLS=80 WRAP="soft"></TEXTAREA><BR><BR> 
Base64 decode<BR> 
<TEXTAREA NAME="decode" ROWS=4 COLS=80 WRAP="soft"></TEXTAREA><BR><BR> 
<INPUT TYPE=BUTTON VALUE="转换" ONCLICK="doit();"> 
</FORM> 
</BODY> 
</html>
Javascript 相关文章推荐
js加强的经典分页实例
Mar 15 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
Jan 25 Javascript
JS下载文件|无刷新下载文件示例代码
Apr 17 Javascript
js实现的tab标签切换效果代码分享
Aug 25 Javascript
JQuery解析XML的方法小结
Apr 02 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
May 28 Javascript
js基本算法:冒泡排序,二分查找的简单实例
Oct 08 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
Oct 26 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
微信小程序页面传多个参数跳转页面的实现方法
May 17 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
May 30 Javascript
JS获取页面窗口大小的代码解读
Dec 01 #Javascript
基于JQuery的抓取博客园首页RSS的代码
Dec 01 #Javascript
jQuery 中使用JSON的实现代码
Dec 01 #Javascript
jquery中dom操作和事件的实例学习 下拉框应用
Dec 01 #Javascript
JS代码放在head和body中的区别分析
Dec 01 #Javascript
js获取浏览器的可视区域尺寸的实现代码
Nov 30 #Javascript
js取滚动条的尺寸的函数代码
Nov 30 #Javascript
You might like
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
php中require和require_once的区别说明
2014/02/27 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
Unix如何添加新的用户
2014/08/20 面试题
学生自我鉴定模板
2013/12/30 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
消防志愿者活动方案
2014/08/23 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技