base64 格式的數(shù)據(jù)是如何實(shí)現(xiàn)的
(給前端大學(xué)加星標(biāo),提升前端技能.)
作者:隱冬
https://juejin.cn/post/6913532512346046472
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法。
對于前端來說,一切可以放路徑的地方,都可以使用base64來替代。
node中的buffer對象可以通過toString('base64')將buffer對象輸出為base64。我們這里來簡述一下漢字是如何轉(zhuǎn)換成為base64的實(shí)現(xiàn)原理。
比如我們來探索一下漢子"哈"通過base64的轉(zhuǎn)換結(jié)果為"5ZOI"是如何實(shí)現(xiàn)的。
首先我們利用nodejs中Buffer對象的from方法,將漢子轉(zhuǎn)換為buffer對象??梢缘玫絜5 93 88三個(gè)16進(jìn)制的字節(jié)。可以看到這個(gè)函子由3個(gè)字節(jié)組成。
const buf = Buffer.from("哈");
console.log(buf); // // e5 93 88
然后再將每個(gè)字節(jié)轉(zhuǎn)換為二進(jìn)制, 0x代表16進(jìn)制,我們需要在e5 93 88前面分別拼上0x, toString方法中可以傳入要轉(zhuǎn)換的字進(jìn)制,這里寫2。
// 將每個(gè)字節(jié)轉(zhuǎn)為二進(jìn)制
(0xe5).toString(2); // 11100101
(0x93).toString(2); // 10010011
(0x88).toString(2); // 10001000
接著將得到的三個(gè)2進(jìn)制數(shù)據(jù)連接在一起,得到111001011001001110001000。
111001011001001110001000
然后將111001011001001110001000每六個(gè)一組進(jìn)行切割,這里可以切割為4部分。
111001 011001 001110 001000
接著再每一組的前面用0補(bǔ)位,湊成8位。
00111001
00011001
00001110
00001000
將得到的四組數(shù)據(jù)分別再轉(zhuǎn)換為10進(jìn)制數(shù)據(jù)。這里一共可以獲得4個(gè)數(shù)字,是不是"哈"這個(gè)字轉(zhuǎn)換為base64后獲取到的4個(gè)字符有些接近了。
parseInt('00111001', 2); // 二進(jìn)制變?yōu)?0進(jìn)制 57
parseInt('00011001', 2); // 二進(jìn)制變?yōu)?0進(jìn)制 25
parseInt('00001110', 2); // 二進(jìn)制變?yōu)?0進(jìn)制 14
parseInt('00001000', 2); // 二進(jìn)制變?yōu)?0進(jìn)制 8
base64的編碼數(shù)據(jù)基本是從A-Z加上a-z再加上0123456789+/中獲取的。我們拼接出這個(gè)字符串。
// base64編碼
let str = 'ABCDEFGHIGKLMNOPQRSTUVWSYZ';
str += str.toLowerCase(); // 小寫字符拼接一次
str += '0123456789+/'; // 數(shù)字拼接一次
我們知道,字符串可以類似數(shù)組一樣通過下標(biāo)來獲取指定位置的字符,這里通過上面10進(jìn)制轉(zhuǎn)換之后的值分別獲取對應(yīng)位置的字符,57獲取的就是5,25獲取的就是Z,14獲取的就是O,8獲取的就是I。
將這四個(gè)字符拼接在一起就是5ZOI。就是之前轉(zhuǎn)換后的base64。
const base64 = str[57] + str[25] + str[14] + str[8]; // 5ZOI
base64轉(zhuǎn)譯步驟
1、將字符串通過Buffer.from獲取buffer,并將buffer中的每個(gè)16的buffer字節(jié)轉(zhuǎn)為2進(jìn)制
2、將所有二進(jìn)制拼接在一起,6個(gè)一組進(jìn)行劃分,在前面補(bǔ)00,湊成8位二進(jìn)制
3、將新的二進(jìn)制轉(zhuǎn)換成10進(jìn)制
4、在base64集合中分別通過10進(jìn)制下標(biāo)取出,并鏈接
點(diǎn)贊和在看就是最大的支持??
