Base64編碼的作用在于將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為一組由A-Z、a-z、0-9、"+"和"/"組成的可打印字符以方便在傳輸或存儲(chǔ)時(shí)使用。例如,在Ajax跨域請求中,瀏覽器無法直接傳輸二進(jìn)制數(shù)據(jù),但可以通過Base64編碼將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可打印字符串,再發(fā)出請求。示例代碼如下:
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對象獲取圖片的二進(jìn)制數(shù)據(jù),然后通過btoa()方法將其轉(zhuǎn)換為Base64編碼的字符串。由于btoa()方法只能接受Unicode字符串,因此還需使用String.fromCharCode.apply()方法將Uint8Array數(shù)組轉(zhuǎn)換為Unicode字符串。最后,在img標(biāo)簽的src屬性中使用"data:image/png;base64," + base64的形式表示圖片的Base64編碼格式。這樣,就可以在頁面中顯示所請求的圖片。
在Javascript中,使用Base64編碼的方法很多,最常用的是將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為Unicode字符串的btoa()方法和將Unicode字符串轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)的atob()方法。下面是兩種方法的用法:
var binaryStr = 'Hello World!'; var base64Str = btoa(binaryStr); // 輸出:SGVsbG8gV29ybGQh var base64Str = 'SGVsbG8gV29ybGQh'; var binaryStr = atob(base64Str); // 輸出:Hello World!
需要注意的是,btoa()方法在轉(zhuǎn)換字符串時(shí),只會(huì)按照每3個(gè)字節(jié)劃分一組進(jìn)行轉(zhuǎn)換,因此在最后一組不足3個(gè)字節(jié)時(shí),會(huì)使用"\x00"進(jìn)行填充。例如,如果使用btoa()方法對"Hello W"進(jìn)行編碼,則輸出的結(jié)果中會(huì)多出兩個(gè)"="符號(hào):
var binaryStr = 'Hello W'; var base64Str = btoa(binaryStr); // 輸出:SGVsbG8gVw== var binaryStr = atob('SGVsbG8gVw=='); // 輸出:Hello W
此外,在Javascript中還可以使用Base64.js和CryptoJS等第三方庫來進(jìn)行Base64編碼和解碼操作。例如,使用Base64.js庫對二進(jìn)制數(shù)據(jù)進(jìn)行Base64編碼的代碼如下:
var binary = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21]); var base64 = base64js.fromByteArray(binary); // 輸出:SGVsbG8gV29ybGQh
需要注意的是,使用第三方庫可以獲得更好的兼容性和可移植性,但也會(huì)增加代碼的復(fù)雜性和體積。
最后,需要強(qiáng)調(diào)的是,在使用Base64編碼時(shí),其編碼后的字符長度會(huì)增加約1/3左右。例如,對于一張1MB的圖片,使用Base64編碼后的字符長度將達(dá)到1.33MB左右。因此,在需要傳輸或存儲(chǔ)大量數(shù)據(jù)時(shí),應(yīng)根據(jù)實(shí)際需求選擇適當(dāng)?shù)膲嚎s和編碼方式,以充分發(fā)揮其優(yōu)勢。