这里有新鲜出炉的 Node.js 教程,程序狗速度看过来!
Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的 易于扩展的网络应用 · Node.js 借助事件驱动, 非阻塞 I/O 模型变得轻量和高效, 非常适合 运行在分布式设备 的 数据密集型 的实时应用
开发者对 Base64 编码肯定很熟悉,是否对它有很清晰的认识就不一定了。实际上 Base64 已经简单到不能再简单了,这篇文章给大家通过示例代码介绍了 node.js 对字符串和图片 base64 编码解码的方法,有需要的朋友们可以通过本文来进行学习,下面来一起看看吧。
一. 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。
那么怎么用 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 的四个字节。这个搞清楚了其实就差不多了。
但是转换到最后你发现不够三个字节了怎么办呢?愿望终于实现了,我们可以用两 个 Base64 来表示一个字符或用三个 Base64 表示两个字符,像下图的 A 对应的第二个 Base64 的二进制位只有两个,把后边的四个补 0 就是了。所以 A 对应的 Base64 字符就是 QQ。上边已经说过了,原则是 Base64 字符的最小单位是四个字符一组,那这才两个字 符,后边补两个 "=" 吧。其实不用 "=" 也不耽误解码,之所以用 "=",可能是考虑到多段编码后的 Base64 字符串拼起来也不会引起混淆。由此可见 Base64 字符串只可能最后出现一个或两个 "=",中间是不可能出现 "=" 的。下图中字符 "BC" 的编码过程也是一样的。
三、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');
总结
来源: http://www.phperz.com/article/17/0705/330991.html