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模块化编程(三)require.js的用法及功能介绍
Jan 17 Javascript
js 限制input只能输入数字、字母和汉字等等
Dec 18 Javascript
轻松实现Bootstrap图片轮播
Apr 20 Javascript
js判断上传文件后缀名是否合法
Jan 28 Javascript
jQuery ajaxForm()的应用
Oct 14 Javascript
微信小程序中实现手指缩放图片的示例代码
Mar 13 Javascript
详解微信小程序中组件通讯
Oct 30 Javascript
什么时候不能在 Node.js 中使用 Lock Files
Jun 24 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
Jul 10 jQuery
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
Element Cascader 级联选择器的使用示例
Jul 27 Javascript
vue-resource 拦截器interceptors使用详解
Jan 18 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使用异或实现的加密解密实例
2013/09/04 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
windows下python安装小白入门教程
2018/09/18 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
基于Python的Post请求数据爬取的方法详解
2019/06/14 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
求职简历中个人的自我评价
2013/12/25 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
小学生表扬稿范文
2015/05/05 职场文书
预备党员半年考察意见
2015/06/01 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
mysql主从复制的实现步骤
2021/10/24 MySQL
使用python求解迷宫问题的三种实现方法
2022/03/17 Python
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android