node.js学习之base64编码解码


Posted in Javascript onOctober 21, 2016

一. Base64编码由来

为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法。

二. Base64编码原理

看一下Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。64个字符用6个bit位就可以全部表示,一个字节有8个bit 位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个 bit,左边两个永远是0。

node.js学习之base64编码解码

那么怎么用6个有效bit来表示传统字符的8个bit呢?8和6的最小公倍数 是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit 的不足。你也可以说用两个Base64字符也能表示一个传统字符,但是采用最小公倍数的方案其实是最减少浪费的。结合下边的图比较容易理解。Man是三个 字符,一共24个有效bit,只好用4个Base64字符来凑齐24个有效位。红框表示的是对应的Base64,6个有效位转化成相应的索引值再对应 Base64字符表,查出"Man"对应的Base64字符是"TWFU"。说到这里有个原则不知道你发现了没有,要转换成Base64的最小单位就是三个字节,对一个字符串来说每次都是三个字节三个字节的转换,对应的是Base64的四个字节。这个搞清楚了其实就差不多了。

node.js学习之base64编码解码

node.js学习之base64编码解码

但是转换到最后你发现不够三个字节了怎么办呢?愿望终于实现了,我们可以用两 个Base64来表示一个字符或用三个Base64表示两个字符,像下图的A对应的第二个Base64的二进制位只有两个,把后边的四个补0就是了。所以 A对应的Base64字符就是QQ。上边已经说过了,原则是Base64字符的最小单位是四个字符一组,那这才两个字 符,后边补两个"="吧。其实不用"="也不耽误解码,之所以用"=",可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。由此可见 Base64字符串只可能最后出现一个或两个"=",中间是不可能出现"="的。下图中字符"BC"的编码过程也是一样的。

node.js学习之base64编码解码

三、node.js普通字符串编码解码:

var b = new Buffer('JavaScript');
var s = b.toString('base64');
// SmF2YVNjcmlwdA==


var b = new Buffer('SmF2YVNjcmlwdA==', 'base64')
var s = b.toString();
// JavaScript

编码解码并转成hex

var b = new Buffer('SmF2YVNjcmlwdA==', 'base64')
var s = b.toString('hex');
// 4a617661536372697074


var b = new Buffer('4a617661536372697074', 'hex')
var s = b.toString('utf8');
// JavaScript

四、node.js编码解码图片

var fs = require('fs');

// function to encode file data to base64 encoded string
function base64_encode(file) {
  // read binary data
  var bitmap = fs.readFileSync(file);
  // convert binary data to base64 encoded string
  return new Buffer(bitmap).toString('base64');
}

// function to create file from base64 encoded string
function base64_decode(base64str, file) {
  // create buffer object from base64 encoded string, it is important to tell the constructor that the string is base64 encoded
  var bitmap = new Buffer(base64str, 'base64');
  // write buffer to file
  fs.writeFileSync(file, bitmap);
  console.log('******** File created from base64 encoded string ********');
}

// convert image to base64 encoded string
var base64str = base64_encode('kitten.jpg');
console.log(base64str);
// convert base64 string back to image 
base64_decode(base64str, 'copy.jpg');

总结

以上就是node.js之base64编码解码的全部内容,希望本文的内容对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
checkbox设置复选框的只读效果不让用户勾选
Aug 12 Javascript
javascript通过className来获取元素的简单示例代码
Jan 10 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
Nov 17 Javascript
node.js中的fs.close方法使用说明
Dec 17 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
快速学习jQuery插件 Cookie插件使用方法
Dec 01 Javascript
炫酷的js手风琴效果
Oct 13 Javascript
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
快速搭建Node.js(Express)用户注册、登录以及授权的方法
May 09 Javascript
基于layui内置模块(element常用元素的操作)
Sep 20 Javascript
jQuery 隐藏/显示效果函数用法实例分析
May 20 jQuery
JavaScript浮点数及运算精度调整详解
Oct 21 #Javascript
利用Node.JS实现邮件发送功能
Oct 21 #Javascript
bootstrap中使用google prettify让代码高亮的方法
Oct 21 #Javascript
BootStrap网页中代码显示用法详解
Oct 21 #Javascript
网页瀑布流布局jQuery实现代码
Oct 21 #Javascript
js运动事件函数详解
Oct 21 #Javascript
javascript轮播图算法
Oct 21 #Javascript
You might like
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
php实现简单洗牌算法
2013/06/18 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
javascript中的隐式调用
2018/02/10 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
Python实现删除文件但保留指定文件
2015/06/21 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
Python应用库大全总结
2018/05/30 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
python实现Zabbix-API监控
2018/09/17 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
Django Rest framework频率原理与限制
2019/07/26 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
Python hashlib模块实例使用详解
2019/12/24 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
Ajax请求总共有多少种Callback
2016/07/17 面试题
有多年工作经验的自我评价
2014/03/02 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
公司开会通知
2015/04/20 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL