base64
實際上是一種編碼轉換方式, 將ASCII
字符轉換成普通文本, 是網絡上最多見的用於傳輸8Bit字節代碼的編碼方式之一。javascript
base64
由字母a-z
、A-Z
、0-9
以及+
和/
, 再加上做爲墊字的=
, 一共65字符組成一個基本字符集, 其餘全部字符均可以根據必定規則, 轉換成該字符集中的字符。html
abcde
=>YWJjZGU=
ABCDE
=>QUJDREU=
java
在平常開發中, 最多見的即是將blob
和base64
之間相互轉換.node
// blob to base64
function blobTobase64(blob) {
const fileReader = new FileReader()
let base64 = ''
fileReader.onload = () => {
base64 = fileReader.result // 讀取base64
}
fileReader.readAsDataURL(blob) // 讀取blob
}
// base64 to blob
function dataURItoBlob(dataURI) {
var mimeString = dataURI
.split(',')[0]
.split(':')[1]
.split(';')[0] // mime類型
var byteString = atob(dataURI.split(',')[1]) //base64 解碼
var arrayBuffer = new ArrayBuffer(byteString.length) //建立ArrayBuffer
var intArray = new Uint8Array(arrayBuffer) //建立視圖
for (var i = 0; i < byteString.length; i++) {
intArray[i] = byteString.charCodeAt(i)
}
return new Blob([intArray], { type: mimeString }) // 轉成 blob
}
複製代碼
最新的瀏覽器自帶了兩個方法用於base64
的編碼和解碼git
分別是atob
和btoa
github
base64
轉成8bit
字節碼8bit
字節碼轉成base64
對於舊版瀏覽器, 可使用js-base64api
目前node
中還不支持使用atob
和btoa
,可是能夠經過Buffer
來實現, 參考文檔數組
if (typeof btoa === 'undefined') {
global.btoa = function (str) {
return Buffer.from(str).toString('base64');
};
}
if (typeof atob === 'undefined') {
global.atob = function (b64Encoded) {
return Buffer.frome(b64Encoded, 'base64').toString();
};
}
複製代碼
base64編碼方式對於中文是不適用的, 由於中文對應多個字節, 所以能夠先使用
encodeURIComponent
編碼後再進行base64
編碼.瀏覽器
源碼網絡
每三個字節做爲一組,每一個字節8bit, 一共是24個二進制位。
'ABCD'
["ABC", "D"] // 每三字節作一組
['01000001010000100100001', '01000100'] // 轉成8bit
複製代碼
將每組的24個二進制位再細分爲四組,每組有6個二進制位, 此時爲二維數組。
[['010000', '010100', '001001', '000011'], ['010001', '00']]
複製代碼
=
。=
。[['010000', '010100', '001001', '000011'], ['010001', '000000']]
複製代碼
在每組前面加兩個00,擴展成32個二進制位,即四個字節。
規則是這麼說, 但這一步我以爲能夠忽略, 由於
00101010
和101010
是同樣的
將每組對應的二進制轉成十進制, 在base64char
字符集中找到對應的字符。
[["Q", "U", "J", "D"], ["R", "A"]]
複製代碼
每一組都最終都應該轉成四個字符
若是不足四個字符, 說明明文中並不足3字節, 所以須要補上墊字符=
, 補夠四個字符
[["Q", "U", "J", "D"], ["R", "A", "=", "="]]
複製代碼
將最後的結果鏈接成字符串, 則爲最終編碼結果。
'ABCD' > 'QUJDRA=='
根據編碼方式來看, 每3個字節將會被編碼成四個字符, 若是不足3個字節, 則補上墊字符=
, 缺幾個就補幾個。
btoa('A') // "QQ=="
btoa('AB') // "QUI="
btoa('ABC') // "QUJD"
btoa('ABCD') // "QUJDRA=="
複製代碼
解碼步驟就是跟編碼步驟反過來
=
外的字符, 在base64char
字符集中找到所在下標。0
。
=
, 說明其明文不足3字節, 則根據墊字符=
的數量, 在該組最後一項中去掉對應個數的0
0
0
String.fromCharCode
將二進制轉成字符, 而後拼接// n進制轉十進制
parseInt('1000', 2) // 8
parseInt('1000', 16) // 4096
// 進制間轉換
(10).toString(2) // "1010", 10進制轉2進制
(0xff).toString(2) // "11111111", 16進制轉2進制
複製代碼