Uint8Array.prototype.setFromBase64()
Baseline
2025
Newly available
Since September 2025, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
Phương thức setFromBase64() của các instance Uint8Array điền vào đối tượng Uint8Array này các byte từ một chuỗi được mã hóa base64, trả về một đối tượng cho biết có bao nhiêu byte đã được đọc và ghi.
Phương thức này phù hợp nhất để điền vào một array buffer đã được cấp phát trước. Nếu bạn chỉ muốn tạo một đối tượng Uint8Array mới từ một chuỗi mã hóa base64, hãy dùng phương thức tĩnh Uint8Array.fromBase64() thay thế.
Cú pháp
setFromBase64(string)
setFromBase64(string, options)
Tham số
string-
Một chuỗi base64 mã hóa các byte cần ghi vào
Uint8Array. Có các yêu cầu giống như tham sốstringcủaUint8Array.fromBase64(). Lưu ý rằng chuỗi chỉ được đọc đến điểm mà mảng đã đầy, vì vậy bất kỳ cú pháp base64 không hợp lệ nào sau điểm đó đều bị bỏ qua. optionsOptional-
Một đối tượng tùy chỉnh quá trình giải mã chuỗi base64. Có các yêu cầu giống như tham số
optionscủaUint8Array.fromBase64().
Giá trị trả về
Một đối tượng chứa các thuộc tính sau:
read-
Số ký tự base64 đã đọc từ chuỗi đầu vào. Nếu dữ liệu đã giải mã vừa với mảng, đây là độ dài của chuỗi đầu vào (bao gồm phần đệm); ngược lại, đây là độ dài đến đoạn 4 ký tự hoàn chỉnh cuối cùng vừa với mảng. Các đoạn sẽ không bao giờ bị tách (vì các bit còn lại không thể được "đưa trở lại" một phần vào base64 mà không cần mã hóa lại hoàn toàn); nếu đoạn tiếp theo không vừa với phần còn lại của mảng, nó sẽ hoàn toàn không được đọc, dẫn đến một hoặc hai byte cuối của mảng không được ghi.
written-
Số byte đã ghi vào
Uint8Array. Sẽ không bao giờ lớn hơnbyteLengthcủaUint8Arraynày.
Ngoại lệ
SyntaxError-
Ném ra nếu chuỗi đầu vào chứa các ký tự ngoài bảng chữ cái được chỉ định, hoặc nếu đoạn cuối không thỏa mãn tùy chọn
lastChunkHandling. TypeError-
Ném ra trong một trong các trường hợp sau:
- Chuỗi đầu vào không phải là chuỗi.
- Đối tượng
optionskhông phải là object hoặcundefined. - Các tùy chọn không có giá trị mong đợi hoặc
undefined.
Ví dụ
>Giải mã một chuỗi base64
Ví dụ này sử dụng các tùy chọn alphabet và lastChunkHandling mặc định để giải mã một chuỗi base64 vào một Uint8Array đã có.
const uint8Array = new Uint8Array(16);
const result = uint8Array.setFromBase64("PGI+ TURO PC9i Pg==");
console.log(result); // { read: 19, written: 10 }
console.log(uint8Array);
// Uint8Array(16) [60, 98, 62, 77, 68, 78, 60, 47, 98, 62, 0, 0, 0, 0, 0, 0]
Giải mã một chuỗi lớn vào một mảng nhỏ
Nếu chuỗi chứa nhiều dữ liệu hơn mảng có thể chứa, phương thức sẽ chỉ ghi số byte mà mảng có thể chứa, mà không loại bỏ bất kỳ bit nào.
const uint8Array = new Uint8Array(8);
const result = uint8Array.setFromBase64("PGI+ TURO PC9i Pg==");
console.log(result); // { read: 9, written: 6 }
console.log(uint8Array);
// Uint8Array(8) [60, 98, 62, 77, 68, 78, 0, 0]
Lưu ý rằng hai byte cuối của mảng không được ghi. Để giải mã hai byte này, chúng ta cần đọc ít nhất ba ký tự base64 nữa, đại diện cho 18 bit. Chúng không thể vừa với hai byte còn lại của mảng, vì vậy chúng ta chỉ có thể ghi 2 đoạn, hay 6 byte.
Đặt dữ liệu tại một offset cụ thể
Phương thức setFromBase64() luôn bắt đầu ghi từ đầu Uint8Array. Nếu bạn muốn ghi vào giữa mảng, bạn có thể ghi vào một TypedArray.prototype.subarray() thay thế.
const uint8Array = new Uint8Array(16);
// Bắt đầu ghi tại offset 2
const result = uint8Array.subarray(2).setFromBase64("PGI+ TURO PC9i Pg==");
console.log(result); // { read: 19, written: 10 }
console.log(uint8Array);
// Uint8Array(16) [0, 0, 60, 98, 62, 77, 68, 78, 60, 47, 98, 62, 0, 0, 0, 0]
Giải mã luồng
Ví dụ này được chuyển thể từ đề xuất gốc. Nó mô phỏng API TextDecoder với tùy chọn stream. Lưu ý cách dùng lastChunkHandling: "stop-before-partial" để xử lý các đoạn chưa hoàn chỉnh.
class Base64Decoder {
#extra = "";
decode(chunk = "", options = {}) {
const opts = { ...options };
// match TextEncoder API
if (opts.stream) {
opts.lastChunkHandling = "stop-before-partial";
}
chunk = this.#extra + chunk;
this.#extra = "";
// For simplicity, allocate new memory every time
// the calculation below is guaranteed to be enough,
// but may be too much if there is whitespace
// if you're really concerned about memory, a TextDecoder style API is a bad choice
let buffer = new Uint8Array(Math.ceil((chunk.length * 3) / 4));
const { read, written } = buffer.setFromBase64(chunk, opts);
buffer = buffer.subarray(0, written);
this.#extra = chunk.slice(read);
return buffer;
}
}
const decoder = new Base64Decoder();
console.log(decoder.decode("SG Vsb ", { stream: true }));
// Uint8Array(3) [72, 101, 108]
console.log(decoder.decode("G8gV29ybGR ", { stream: true }));
// Uint8Array(6) [108, 111, 32, 87, 111, 114]
console.log(decoder.decode(""));
// Uint8Array(2) [108, 100]
Đặc tả
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-uint8array.prototype.setfrombase64> |