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 无废话系列教程(一) jquery入门 [推荐]
Jun 23 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
Nov 21 Javascript
jQuery实现自定义下拉列表
Jan 05 Javascript
浅析Bootstrap组件之面板组件
May 04 Javascript
用js实现简单算法的实例代码
Sep 24 Javascript
任意Json转成无序列表的方法示例
Dec 09 Javascript
vue+element-ui+ajax实现一个表格的实例
Mar 09 Javascript
微信小程序将字符串生成二维码图片的操作方法
Jul 17 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
Dec 10 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
Nov 06 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
社区(php&&mysql)四
2006/10/09 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
解析Python中while true的使用
2015/10/13 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python if语句知识点用法总结
2018/06/10 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
大专应届生个人简历的自我评价
2013/10/15 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
创业计划书之书店
2019/09/10 职场文书