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 相关文章推荐
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
深入浅出分析javaScript中this用法
May 09 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
Feb 22 Javascript
Angular.js基础学习之初始化
Mar 10 Javascript
关于javascript作用域的常见面试题分享
Jun 18 Javascript
JavaScript操作文件_动力节点Java学院整理
Jun 30 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
Aug 23 Javascript
微信小程序排坑指南详解
May 23 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
Nov 05 Javascript
浅谈在Vue.js中如何实现时间转换指令
Jan 06 Javascript
vue.js实现简单购物车功能
May 30 Javascript
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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php微信公众号开发模式详解
2016/11/28 PHP
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
python使用Berkeley DB数据库实例
2014/09/26 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
Android面试题附答案
2014/12/08 面试题
区域销售经理岗位职责
2013/12/10 职场文书
企业年度评优方案
2014/06/02 职场文书
工作求职自荐信
2014/06/13 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
合作意向书
2014/07/30 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
搞笑结婚保证书
2015/05/08 职场文书
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python
redis 解决库存并发问题实现数量控制
2022/04/08 Redis
如何基于python实现单目三维重建详解
2022/06/25 Python