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 相关文章推荐
XML的代替者----JSON
Jul 21 Javascript
基于jsTree的无限级树JSON数据的转换代码
Jul 27 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
jQuery插件实现可输入和自动匹配的下拉框
Oct 24 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 Javascript
详解Angular2学习笔记之Html属性绑定
Jan 03 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
May 15 Javascript
vue2.0学习之axios的封装与vuex介绍
May 28 Javascript
深入浅出理解JavaScript闭包的功能与用法
Aug 01 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
Nov 05 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
Jan 18 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验证码类实例分享
2013/12/27 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
python实现超市商品销售管理系统
2019/10/25 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
Python原始套接字编程实例解析
2020/01/29 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
数控加工专业毕业生自荐信
2013/09/27 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
参观接待方案
2014/03/17 职场文书
小学运动会口号
2014/06/07 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
Python天气语音播报小助手
2021/09/25 Python