<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          base64 格式的數(shù)據(jù)是如何實(shí)現(xiàn)的

          共 1964字,需瀏覽 4分鐘

           ·

          2021-03-17 10:16

          (給前端大學(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)贊和在看就是最大的支持??

          瀏覽 38
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美操逼视频网 | 青青草视频在线免费看 | 精品xxxx | 风流少妇一区二区三区91 | 国产一区二区黄色片 |