Base64實現圖片的編碼和解碼
阿新 • • 發佈:2018-12-10
前端開發中,經常會遇到base64編碼的問題,以前不是很明白,今天就去研究一下到底什麼是base64編碼。
什麼是base64編碼?
- 還是wiki百科上解釋的比較清楚:
- Base64是一種基於64個可列印字元來表示二進位制資料的表示方法。由於 2^6=64 ,所以每6個位元為一個單元,對應某個可列印字元。3個位元組有24個位元,對應於4個Base64單元,即3個位元組可由4個可列印字元來表示。
- 編碼“Man”
- 如果要編碼的位元組數不能被3整除,最後會多出1個或2個位元組,那麼可以使用下面的方法進行處理:先使用0位元組值在末尾補足,使其能夠被3整除,然後再進行Base64的編碼。在編碼後的Base64文字後加上一個或兩個=號,代表補足的位元組數。也就是說,當最後剩餘兩個八位位元組(2個byte)時,最後一個6位的Base64位元組塊有四位是0值,最後附加上兩個等號;如果最後剩餘一個八位位元組(1個byte)時,最後一個6位的base位元組塊有兩位是0值,最後附加一個等號。 參考下表:
現在明白base64編碼是怎麼回事了吧,下面我們更深入的去看一下base64編碼的使用。
- 我們用node來實現把一個圖片編碼成base64,再把一個base64字串解碼成圖片儲存。以下是程式碼實現:
-
google的語音搜尋圖示就是base64編碼的,我們可以在控制檯上看到base64字串,下面我們編碼來把這個圖片轉成base64字串。
const fs = require('fs'); const path = require('path') ; const Buffer = require('buffer').Buffer; /** * @param {String} fileName */ function encode_base64(fileName){ console.log(fileName) fs.readFile(path.join(__dirname,fileName),(err,data)=>{ if(err){ throw err; }else{ let buf = Buffer.from(data); let base64 = buf.toString('base64'); fs.writeFile(path.join(__dirname,'voice.txt'),base64,err =>{ if(err) throw err; }); return base64; } }) }
- 執行程式碼,我們在生成的voice.txt檔案中看到 iVBORw0KGgo .... QmCC,是和網頁上的一樣的,大功告成。
- 接下來我們寫解碼函式。
/** * * @param {String} base64Str * @param {String} fileName */ function decode_base64(base64Str,fileName){ let data = Buffer.from(base64Str,'base64'); fs.writeFile(path.join(__dirname,fileName),data,err =>{ if(err){ throw err; }else{ return true; } }) } let pigBaseStr = "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"; decode_base64(pigBaseStr,'pig.png');
- 我們可以看到成功地生成了pig.png的圖片。
- 到這裡,你對base64的問題是不是搞清楚了呢?