最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js學(xué)習(xí)之base64編碼解碼

 更新時間:2016年10月21日 11:40:03   作者:Nano  
開發(fā)者對Base64編碼肯定很熟悉,是否對它有很清晰的認(rèn)識就不一定了。實際上Base64已經(jīng)簡單到不能再簡單了,這篇文章給大家通過示例代碼介紹了node.js對字符串和圖片base64編碼解碼的方法,有需要的朋友們可以通過本文來進行學(xué)習(xí),下面來一起看看吧。

一. Base64編碼由來

為什么會有Base64編碼呢?因為有些網(wǎng)絡(luò)傳送渠道并不支持所有的字節(jié),例如傳統(tǒng)的郵件只支持可見字符的傳送,像ASCII碼的控制字符就 不能通過郵件傳送。這樣用途就受到了很大的限制,比如圖片二進制流的每個字節(jié)不可能全部是可見字符,所以就傳送不了。最好的方法就是在不改變傳統(tǒng)協(xié)議的情 況下,做一種擴展方案來支持二進制文件的傳送。把不可打印的字符也能用可打印字符來表示,問題就解決了。Base64編碼應(yīng)運而生,Base64就是一種 基于64個可打印字符來表示二進制數(shù)據(jù)的表示方法。

二. Base64編碼原理

看一下Base64的索引表,字符選用了"A-Z、a-z、0-9、+、/" 64個可打印字符。數(shù)值代表字符的索引,這個是標(biāo)準(zhǔn)Base64協(xié)議規(guī)定的,不能更改。64個字符用6個bit位就可以全部表示,一個字節(jié)有8個bit 位,剩下兩個bit就浪費掉了,這樣就不得不犧牲一部分空間了。這里需要弄明白的就是一個Base64字符是8個bit,但是有效部分只有右邊的6個 bit,左邊兩個永遠是0。

那么怎么用6個有效bit來表示傳統(tǒng)字符的8個bit呢?8和6的最小公倍數(shù) 是24,也就是說3個傳統(tǒng)字節(jié)可以由4個Base64字符來表示,保證有效位數(shù)是一樣的,這樣就多了1/3的字節(jié)數(shù)來彌補Base64只有6個有效bit 的不足。你也可以說用兩個Base64字符也能表示一個傳統(tǒng)字符,但是采用最小公倍數(shù)的方案其實是最減少浪費的。結(jié)合下邊的圖比較容易理解。Man是三個 字符,一共24個有效bit,只好用4個Base64字符來湊齊24個有效位。紅框表示的是對應(yīng)的Base64,6個有效位轉(zhuǎn)化成相應(yīng)的索引值再對應(yīng) Base64字符表,查出"Man"對應(yīng)的Base64字符是"TWFU"。說到這里有個原則不知道你發(fā)現(xiàn)了沒有,要轉(zhuǎn)換成Base64的最小單位就是三個字節(jié),對一個字符串來說每次都是三個字節(jié)三個字節(jié)的轉(zhuǎn)換,對應(yīng)的是Base64的四個字節(jié)。這個搞清楚了其實就差不多了。

但是轉(zhuǎn)換到最后你發(fā)現(xiàn)不夠三個字節(jié)了怎么辦呢?愿望終于實現(xiàn)了,我們可以用兩 個Base64來表示一個字符或用三個Base64表示兩個字符,像下圖的A對應(yīng)的第二個Base64的二進制位只有兩個,把后邊的四個補0就是了。所以 A對應(yīng)的Base64字符就是QQ。上邊已經(jīng)說過了,原則是Base64字符的最小單位是四個字符一組,那這才兩個字 符,后邊補兩個"="吧。其實不用"="也不耽誤解碼,之所以用"=",可能是考慮到多段編碼后的Base64字符串拼起來也不會引起混淆。由此可見 Base64字符串只可能最后出現(xiàn)一個或兩個"=",中間是不可能出現(xiàn)"="的。下圖中字符"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

編碼解碼并轉(zhuǎn)成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');

總結(jié)

以上就是node.js之base64編碼解碼的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

最新評論

中山市| 湟中县| 馆陶县| 离岛区| 沙坪坝区| 夏河县| 澜沧| 阿拉善右旗| 阜宁县| 安陆市| 汶川县| 望城县| 三门峡市| 沂源县| 望江县| 泰州市| 富裕县| 定兴县| 中超| 石屏县| 东源县| 瑞昌市| 辽源市| 托克逊县| 宣威市| 武城县| 武强县| 雷山县| 双峰县| 鞍山市| 丰都县| 明光市| 广河县| 丹棱县| 普兰店市| 双柏县| 铜山县| 会泽县| 奉化市| 攀枝花市| 新巴尔虎右旗|