atob
ฟังก์ชั่นจะถอดรหัสสตริง Base64 เข้ารหัสเป็นสตริงใหม่ที่มีตัวอักษรสำหรับไบต์ของข้อมูลไบนารีแต่ละ
const byteCharacters = atob(b64Data);
รหัสจุดของอักขระแต่ละตัว (charCode) จะเป็นค่าของไบต์ เราสามารถสร้างอาร์เรย์ของค่าไบต์โดยใช้สิ่งนี้โดยใช้.charCodeAt
วิธีการสำหรับตัวละครแต่ละตัวในสตริง
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
คุณสามารถแปลงอาร์เรย์ของค่าไบต์นี้เป็นอาร์เรย์ไบต์ที่พิมพ์จริงโดยส่งผ่านไปยังตัวUint8Array
สร้าง
const byteArray = new Uint8Array(byteNumbers);
ในทางกลับกันสามารถแปลงเป็น BLOB โดยห่อในอาร์เรย์และส่งผ่านไปยังตัวBlob
สร้าง
const blob = new Blob([byteArray], {type: contentType});
รหัสดังกล่าวใช้งานได้ อย่างไรก็ตามประสิทธิภาพสามารถปรับปรุงได้เพียงเล็กน้อยโดยการประมวลผลbyteCharacters
ชิ้นเล็ก ๆ มากกว่าในคราวเดียว ในการทดสอบคร่าวๆของฉัน 512 ไบต์ดูเหมือนว่าจะมีขนาดที่ดี สิ่งนี้ทำให้เรามีฟังก์ชั่นดังต่อไปนี้
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const blob = b64toBlob(b64Data, contentType);
const blobUrl = URL.createObjectURL(blob);
window.location = blobUrl;
ตัวอย่างเต็มรูปแบบ:
const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const contentType = 'image/png';
const b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
const blob = b64toBlob(b64Data, contentType);
const blobUrl = URL.createObjectURL(blob);
const img = document.createElement('img');
img.src = blobUrl;
document.body.appendChild(img);