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控制iframe滚动的代码
Apr 10 Javascript
javascript一些实用技巧小结
Mar 18 Javascript
关于div自适应高度/左右高度自适应一致的js代码
Mar 22 Javascript
Angularjs material 实现搜索框功能
Mar 08 Javascript
jQuery添加options点击事件并传值实例代码
May 18 Javascript
详解Node.Js如何处理post数据
Sep 19 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
详解在 Angular 项目中添加 clean-blog 模板
Jul 04 Javascript
ES6模块化的import和export用法方法总结
Aug 08 Javascript
jquery 键盘事件的使用方法详解
Sep 13 jQuery
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
Mar 13 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 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程序?
2006/12/08 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
php中smarty区域循环的方法
2015/06/11 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
python 判断自定义对象类型
2009/03/21 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
您的网上新华书店:文轩网
2016/08/24 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
平面设计岗位职责
2013/12/14 职场文书
幼儿教师考核制度
2014/01/25 职场文书
机关单位动员会主持词
2014/03/20 职场文书
银行求职信
2014/05/31 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis