直接先把方法貼出來(參考了Stack Overflow)
function transformArrayBufferToBase64 (buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
for (var len = bytes.byteLength, i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
下面解釋下方法中用到的一些類型(參考MDN)
-
ArrayBuffer
ArrayBuffer對象被用來表示一個通用的罐脊,固定長度的二進制數(shù)據(jù)緩沖區(qū)定嗓。
但是,我們并不能直接操作ArrayBuffer萍桌,需要先把它轉(zhuǎn)換成TypedArray類型或者DataView類型才能使用宵溅。
-
TypedArray
簡單來說就是更詳細,類型更明確的ArrayBuffer上炎。
-
Uint8Array
Uint8Array 就是一種 TypedArray恃逻,無符號整形數(shù)組。
-
Base64
不想貼官方介紹了藕施,我們只要知道這是個編碼規(guī)則就行了寇损。有兩個重要的方法:encode - btoa(stringToEncode) 和 decode - atob(encodedData)。
atob 接受的參數(shù)肯定就是base64的編碼裳食,但是 btoa 接受的參數(shù)是有限制的矛市,可以用下面的方法對
btoa 方法進行封裝(封裝后可以接收中文和特殊符號)。function utoa(str) { return window.btoa(unescape(encodeURIComponent(str))); }
有哪些方法會產(chǎn)生上面的類型诲祸?
- HTMLCanvasElement.toDataURL()浊吏,返回一個包含 base64 編碼的字符串
- CanvasRenderingContext2D.getImageData(),返回一個 ImageData 類型救氯,來自 Uint8ClampedArray找田,而 Uint8ClampedArray 則是上文提到的 TypedArray 中的一種