<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í)現(xiàn)原理

          共 3972字,需瀏覽 8分鐘

           ·

          2021-07-05 13:51

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

            作者 |  請(qǐng)叫我宋某某

          來(lái)源 |  urlify.cn/qArEjq

          base64是處理二進(jìn)制數(shù)據(jù)的一種編碼方式,可用于把二進(jìn)制數(shù)據(jù)編碼成64個(gè)可打印的字符。

          學(xué)習(xí)base64之前,先了解一下什么是字節(jié)與編碼

          什么是字節(jié)

          互聯(lián)網(wǎng)中的數(shù)據(jù)都是用字節(jié)來(lái)表示的,一個(gè)字節(jié)有8位二進(jìn)制數(shù)據(jù)組成即00000000 -- 11111111

          什么是編碼

          編碼是把字符串轉(zhuǎn)化成二進(jìn)制數(shù)據(jù)的一種方式,計(jì)算機(jī)發(fā)展的過(guò)程中,最先定義了ASCII編碼,用于表示英文字符和一些英文字符為128個(gè)字符;后來(lái)隨著計(jì)算機(jī)被普及到各國(guó)ASCII的編碼已經(jīng)不能滿足于顯示各國(guó)語(yǔ)言的文字,所以說(shuō)后面發(fā)展出了GBK、UNICODE 、UTF8、UTF16等不同類(lèi)型的編碼,在utf8編碼中一個(gè)英文字符占用1個(gè)字節(jié),一個(gè)中文字符占用3個(gè)字節(jié)

          base64編碼表

          碼值字符碼值字符碼值字符碼值字符
          0A16Q32g48w
          1B17R33h49x
          2C18S34i50y
          3D19T35j51z
          4E20U36k520
          5F21V37l531
          6G22W38m542
          7H23X39n553
          8I24Y40o564
          9J25Z41p575
          10K26a42q586
          11L27b43r597
          12M28c44s608
          13N29d45t619
          14O30e46u62+
          15P31f47v63/

          base64的實(shí)現(xiàn)

          base64是,64代表的就是6位二進(jìn)制數(shù)據(jù),通過(guò)把字符串轉(zhuǎn)化為二進(jìn)制數(shù)據(jù),然后按照每6位二進(jìn)制數(shù)據(jù)來(lái)進(jìn)行分割再把這6位二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為10進(jìn)制數(shù)找到對(duì)應(yīng)的映射表就可生成base64編碼

          具體實(shí)現(xiàn)步驟如下:

          1. 字符串轉(zhuǎn)化為2進(jìn)制數(shù)據(jù)

          2. 2進(jìn)制數(shù)據(jù)按照每6位一組分割, 不足6位的補(bǔ)0

          3. 6位二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為十進(jìn)制數(shù)

          4. 在對(duì)應(yīng)的base64映射表中找到對(duì)應(yīng)的映射字符,補(bǔ)0的每?jī)晌挥靡粋€(gè)=號(hào)表示

          例子

          以字符串'A'為例

          1. 首先轉(zhuǎn)為16進(jìn)制數(shù)據(jù)為41對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)為01000001

          2. 每6位二進(jìn)制數(shù)據(jù)分割為一組結(jié)果為010000 010000

          3. 6位二進(jìn)制轉(zhuǎn)化為10進(jìn)制的結(jié)果為16 16

          4. base64映射表對(duì)用的字符為Q Q

          5. 因?yàn)檠a(bǔ)了4個(gè)0所以字符串A對(duì)用的base64編碼就為QQ==

          代碼實(shí)現(xiàn)

          function addZero2Front(str) {
              let len = str.length
              while (len < 8) {
                  str = '0' + str
                  len++
              }

              return str
          }

          function getBinary(str) {
              const buf = Buffer.from(str)
              let binary = ''
              for (let i = 0; i < buf.length; i++) {
                  binary += addZero2Front(
                      buf[i].toString(2)
                  )
              }
              return binary
          }

          let map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

          function base64(str) {
              let binary = getBinary(str)
              let num = binary.length % 6
              let needAddZeroLen = num !== 0 ? 6 - num : num
              let i = needAddZeroLen;
              let endStr = ''
              let res = ''
              while (i > 0) {
                  binary += '0'
                  i--
              }
              i = needAddZeroLen
              while ( i > 0) {
                  endStr += '='
                  i -= 2
              }
              i = 0
              while (i < binary.length) {
                  let idx = parseInt(
                      binary.slice(i, i + 6),
                      2
                  )
                  res += map[idx]
                  i+=6
              }

              res += endStr
              return res
          }

          結(jié)束語(yǔ)

          雖然base64可以便于二進(jìn)制數(shù)據(jù)傳輸且不會(huì)造成亂碼;但是值得注意的是,由于base64的性質(zhì)(把8個(gè)字節(jié)轉(zhuǎn)化為6個(gè)字節(jié)儲(chǔ)存),所以不可避免的會(huì)把文件的大小增大1/3,所以base64也不可盲目使用








          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  国产群P| 免费看日韩毛片 | 成人簧片在线浏览观看 | 一级片日逼片 | 免费中文无码 |