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 相关文章推荐
firefox中JS读取XML文件
Dec 21 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
Apr 15 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
JavaScript控制网页层收起和展开效果的方法
Apr 15 Javascript
浅析node连接数据库(express+mysql)
Nov 30 Javascript
Easyui form combobox省市区三级联动
Jan 13 Javascript
详解使用路由延迟加载 Angular 模块
Oct 12 Javascript
css配合JavaScript实现tab标签切换效果
Oct 11 Javascript
代码实例ajax实现点击加载更多数据图片
Oct 12 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
javascript实现点击小图显示大图
Nov 29 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
PHP大转盘中奖概率算法实例
2014/10/21 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Hadoop中的Python框架的使用指南
2015/04/22 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
Python实现的端口扫描功能示例
2018/04/08 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
python的常见矩阵运算(小结)
2019/08/07 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
python openpyxl模块的使用详解
2021/02/25 Python
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
澳大利亚百货公司:David Jones
2018/02/08 全球购物
银行自荐信怎么写
2015/03/05 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
JavaScript分页组件使用方法详解
2021/07/26 Javascript
Redis入门教程详解
2021/08/30 Redis
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏