1. 程式人生 > >js base64轉二進制

js base64轉二進制

arr function 長度 數據 rip class str ava ring

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
}

  

js base64轉二進制