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 相关文章推荐
获取网站跟路径的javascript代码(站点及虚拟目录)
Oct 20 Javascript
JQuery从头学起第二讲
Jul 04 Javascript
javascript中"/"运算符常见错误
Oct 13 Javascript
浅谈javascript面向对象程序设计
Jan 21 Javascript
javascript实现在线客服效果
Jul 15 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
JS实现加载和读取XML文件的方法详解
Apr 24 Javascript
bootstrap switch开关组件使用方法详解
Aug 22 Javascript
layui--select使用以及下拉框实现键盘选择的例子
Sep 24 Javascript
JS前端基于canvas给图片添加水印
Nov 11 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
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 数组教程 定义数组
2009/10/23 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
javascript 跳转代码集合
2009/12/03 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
python实现的各种排序算法代码
2013/03/04 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
如何通过Python实现标签云算法
2019/07/02 Python
pandas分区间,算频率的实例
2019/07/04 Python
python plotly绘制直方图实例详解
2019/07/22 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
用友笔试题目
2016/10/25 面试题
心理学专业毕业生推荐信范文
2013/11/21 职场文书
大学生创业计划书的范文
2014/01/07 职场文书
考试作弊被抓检讨书
2014/01/10 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js