Base64編碼的作用在于將二進制數據轉換為一組由A-Z、a-z、0-9、"+"和"/"組成的可打印字符以方便在傳輸或存儲時使用。例如,在Ajax跨域請求中,瀏覽器無法直接傳輸二進制數據,但可以通過Base64編碼將二進制數據轉換為可打印字符串,再發出請求。示例代碼如下:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://example.com/image.png', true); xhr.responseType = 'arraybuffer'; xhr.onload = function() { var base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(xhr.response))); var imgSrc = 'data:image/png;base64,' + base64; document.querySelector('img').src = imgSrc; }; xhr.send();
上面代碼中,首先使用XMLHttpRequest對象獲取圖片的二進制數據,然后通過btoa()方法將其轉換為Base64編碼的字符串。由于btoa()方法只能接受Unicode字符串,因此還需使用String.fromCharCode.apply()方法將Uint8Array數組轉換為Unicode字符串。最后,在img標簽的src屬性中使用"data:image/png;base64," + base64的形式表示圖片的Base64編碼格式。這樣,就可以在頁面中顯示所請求的圖片。
在Javascript中,使用Base64編碼的方法很多,最常用的是將二進制數據轉換為Unicode字符串的btoa()方法和將Unicode字符串轉換為二進制數據的atob()方法。下面是兩種方法的用法:
var binaryStr = 'Hello World!'; var base64Str = btoa(binaryStr); // 輸出:SGVsbG8gV29ybGQh var base64Str = 'SGVsbG8gV29ybGQh'; var binaryStr = atob(base64Str); // 輸出:Hello World!
需要注意的是,btoa()方法在轉換字符串時,只會按照每3個字節劃分一組進行轉換,因此在最后一組不足3個字節時,會使用"\x00"進行填充。例如,如果使用btoa()方法對"Hello W"進行編碼,則輸出的結果中會多出兩個"="符號:
var binaryStr = 'Hello W'; var base64Str = btoa(binaryStr); // 輸出:SGVsbG8gVw== var binaryStr = atob('SGVsbG8gVw=='); // 輸出:Hello W
此外,在Javascript中還可以使用Base64.js和CryptoJS等第三方庫來進行Base64編碼和解碼操作。例如,使用Base64.js庫對二進制數據進行Base64編碼的代碼如下:
var binary = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21]); var base64 = base64js.fromByteArray(binary); // 輸出:SGVsbG8gV29ybGQh
需要注意的是,使用第三方庫可以獲得更好的兼容性和可移植性,但也會增加代碼的復雜性和體積。
最后,需要強調的是,在使用Base64編碼時,其編碼后的字符長度會增加約1/3左右。例如,對于一張1MB的圖片,使用Base64編碼后的字符長度將達到1.33MB左右。因此,在需要傳輸或存儲大量數據時,應根據實際需求選擇適當的壓縮和編碼方式,以充分發揮其優勢。