base64 編碼規則
1、把3個字符變成4個字符。
2、每76個字符加一個換行符。
3、最后的結束符也要處理。
轉換前 11111101, 11111111, 11111111 (二進制)
轉換后 00111111, 00011111, 00111111, 00111111 (二進制,因為base64只需要6位就能滿足,但是一個字節是8位,所以多出來2個沒用的0)
要轉回2進制,就需要把那前面的00 砍掉 並且讓后面的數據接上來。
第一個做法: 使用toString(2)轉換成2進制字符串,再進行拼接,但是二進制數據太多,直接操作內存會快很多,所以不再使用字符串。
第二個做法:
// base64編碼表 const map = { "0": 52, "1": 53, "2": 54, "3": 55, "4": 56, "5": 57, "6": 58, "7": 59, "8": 60, "9": 61, "A": 0, "B": 1, "C": 2, "D": 3, "E": 4, "F": 5, "G": 6, "H": 7, "I": 8, "J": 9, "K": 10, "L": 11, "M": 12, "N": 13, "O": 14, "P": 15, "Q": 16, "R": 17, "S": 18, "T": 19, "U": 20, "V": 21, "W": 22, "X": 23, "Y": 24, "Z": 25, "a": 26, "b": 27, "c": 28, "d": 29, "e": 30, "f": 31, "g": 32, "h": 33, "i": 34, "j": 35, "k": 36, "l": 37, "m": 38, "n": 39, "o": 40, "p": 41, "q": 42, "r": 43, "s": 44, "t": 45, "u": 46, "v": 47, "w": 48, "x": 49, "y": 50, "z": 51, "+": 62, "/": 63 } function base64to2(base64) { let len = base64.length * .75 // 轉換為int8array所需長度 base64 = base64.replace(/=*$/, '') // 去掉=號(占位的) const int8 = new Int8Array(len) //設置int8array視圖 let arr1, arr2, arr3, arr4, p = 0 for (let i = 0; i < base64.length; i += 4) { arr1 = map[base64[i]] // 每次循環 都將base644個字節轉換為3個int8array直接 arr2 = map[base64[i + 1]] arr3 = map[base64[i + 2]] arr4 = map[base64[i + 3]] // 假設數據arr 數據 00101011 00101111 00110011 00110001 int8[p++] = arr1 << 2 | arr2 >> 4 // 上面的操作 arr1向左邊移動2位 變為10101100 // arr2 向右移動4位:00000010 // | 為'與'操作: 10101110 int8[p++] = arr2 << 4 | arr3 >> 2 int8[p++] = arr3 << 6 | arr4 } return int8 }
第三個做法:轉成blob,
function base64toBlob(base64,type) { // 將base64轉為Unicode規則編碼 bstr = atob(base64, type), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n) // 轉換編碼后才可以使用charCodeAt 找到Unicode編碼 } return new Blob([u8arr], { type, }) }