TypedArray dalam TypeScript
Artikel ini menjelaskan tentang TypedArray dalam TypeScript.
Kami akan menjelaskan TypedArray di TypeScript, termasuk contoh praktisnya.
YouTube Video
TypedArray dalam TypeScript
TypedArray adalah mekanisme untuk menangani data biner secara efisien. Ini sangat berguna untuk operasi biner tingkat rendah seperti data gambar berukuran besar, aliran byte jaringan, dan array numerik untuk WebGL.
Cara membuat ArrayBuffer
ArrayBuffer mewakili area byte dengan panjang tetap. Pertama, buat buffer dan periksa ukurannya serta panjang bytenya.
1// Create an ArrayBuffer of 16 bytes
2const buffer: ArrayBuffer = new ArrayBuffer(16);
3console.log("buffer.byteLength:", buffer.byteLength); // 16
- Kode ini membuat area kosong sebesar 16 byte.
ArrayBuffersendiri tidak memiliki fungsi baca/tulis, jadi Anda mengaksesnya melaluiTypedArrayatauDataView.
Jenis-jenis TypedArray
Ada banyak jenis TypedArray, seperti berikut ini. Jenis-jenis ini berbeda tergantung pada tipe data dan ukuran yang mereka tangani.
| TypedArray | Tipe Data | Ukuran Bit |
|---|---|---|
Int8Array |
Integer 8-bit | 8 bit |
Uint8Array |
Integer 8-bit tanpa tanda | 8 bit |
Uint8ClampedArray |
Integer 8-bit tanpa tanda yang dibatasi | 8 bit |
Int16Array |
Integer 16-bit | 16 bit |
Uint16Array |
Integer 16-bit tanpa tanda | 16 bit |
Int32Array |
Integer 32-bit | 32 bit |
Uint32Array |
Integer 32-bit tanpa tanda | 32 bit |
Float32Array |
Angka floating-point 32-bit | 32 bit |
Float64Array |
Angka floating-point 64-bit | 64 bit |
TypedArray dasar (Uint8Array, Int16Array, Float32Array, dll.)
TypedArray membuat 'tampilan bertipe' di atas sebuah ArrayBuffer. Di bawah ini adalah contoh membuat dan menggunakan beberapa TypedArray yang umum.
1// Create a buffer and different typed views over it
2const buf = new ArrayBuffer(8); // 8 bytes
3
4// Create views
5const u8 = new Uint8Array(buf); // 8 x uint8
6const i16 = new Int16Array(buf); // 4 x int16 (since each int16 is 2 bytes)
7const f32 = new Float32Array(buf); // 2 x float32 (4 bytes each)
8
9console.log("Uint8 length:", u8.length);
10console.log("Int16 length:", i16.length);
11console.log("Float32 length:", f32.length);- Dengan membuat beberapa tampilan pada
ArrayBufferyang sama, Anda dapat membaca dan menulis memori yang sama dengan tipe atau tingkat ketelitian yang berbeda.lengthpada tampilan adalah jumlah elemen, sedangkanbyteLengthadalah jumlah bytenya.
Menulis dan membaca (operasi tingkat byte)
Ketika Anda menulis nilai ke TypedArray, byte yang sesuai di memori akan diperbarui. Anda dapat melihat perubahan tersebut ketika membaca buffer yang sama dengan tampilan berbeda.
1// Demonstrate writing via one view and reading via another
2const buffer2 = new ArrayBuffer(4);
3const u8view = new Uint8Array(buffer2);
4const u32view = new Uint32Array(buffer2);
5
6u8view[0] = 0x78;
7u8view[1] = 0x56;
8u8view[2] = 0x34;
9u8view[3] = 0x12;
10
11console.log("Uint8 bytes:", Array.from(u8view)); // [120, 86, 52, 18]
12console.log("Uint32 value (platform endianness):", u32view[0]); // value depends on endianness
- Pada contoh ini, kami menulis urutan byte lalu membaca area yang sama sebagai integer 32-bit. Perhatikan bahwa keluaran tergantung pada endianness dari lingkungan eksekusi.
Endianness (urutan byte) dan DataView
DataView berguna jika Anda ingin mengontrol masalah endianness yang bergantung pada lingkungan. DataView memungkinkan Anda menentukan endianness saat membaca dan menulis.
1// Use DataView to read/write with explicit endianness control
2const b = new ArrayBuffer(4);
3const dv = new DataView(b);
4
5// write little-endian 32-bit integer
6dv.setUint32(0, 0x12345678, true);
7
8// read as little-endian and big-endian
9const little = dv.getUint32(0, true);
10const big = dv.getUint32(0, false);
11
12console.log("little-endian read:", little.toString(16)); // "12345678"
13console.log("big-endian read:", big.toString(16)); // different value
DataViewadalah mekanisme yang nyaman untuk membaca dan menulis byte secara detail. Ini mendukung berbagai tipe, seperti integer bertanda atau tak bertanda dan angka floating-point, serta memungkinkan Anda menentukan endianness (urutan byte) secara eksplisit, yang sangat berguna saat mengimplementasikan protokol biner.
Perbedaan antara subarray dan slice
subarray dari TypedArray menghasilkan tampilan yang berbagi buffer asli, sedangkan slice mengembalikan salinan baru. Performa dan efek samping akan berbeda tergantung mana yang Anda gunakan.
1const base = new Uint8Array([1, 2, 3, 4, 5]);
2
3const shared = base.subarray(1, 4); // shares underlying buffer
4const copied = base.slice(1, 4); // copies data
5
6shared[0] = 99;
7console.log("base after shared modification:", base); // shows change
8console.log("copied remains:", copied); // unaffected
- Jika Anda memodifikasi tampilan bersama, array asli juga akan berubah, yang mungkin menyebabkan efek samping yang tidak diinginkan. Jika Anda ingin menjaga array asli dengan aman, Anda dapat membuat salinannya terlebih dahulu menggunakan
slice().
Menyalin buffer dan konversi tipe (konversi antar TypedArray)
Kami akan menjelaskan cara menyalin data antar TypedArray dan cara menempelkan bagian menggunakan metode set.
1// Copy and convert between typed arrays
2const src = new Float32Array([1.5, 2.5, 3.5]);
3const dst = new Uint16Array(src.length);
4
5// Convert by mapping (explicit conversion)
6for (let i = 0; i < src.length; i++) {
7 dst[i] = Math.round(src[i]); // simple conversion rule
8}
9console.log("converted dst:", Array.from(dst)); // [2, 2, 4]
10
11// Using set to copy bytes (requires compatible underlying buffer or same element type)
12const src2 = new Uint8Array([10, 20, 30]);
13const dst2 = new Uint8Array(6);
14dst2.set(src2, 2); // copy src2 into dst2 starting at index 2
15console.log("dst2 after set:", Array.from(dst2)); // [0,0,10,20,30,0]
- Jika tipe elemen berbeda, Anda perlu mengonversi nilai, seperti pembulatan atau pemeriksaan rentang, bukan sekadar menyalin saja.
setmemungkinkan penyalinan cepat antaraTypedArraydengan tipe elemen yang sama.
Contoh praktis: parser protokol biner (implementasi sederhana)
Di sini, kami memperkenalkan contoh parser sederhana yang membaca data biner dengan format tetap yang terdiri dari 1-byte tipe, 2-byte panjang data, dan payload berikutnya.
1// Simple binary message parser:
2// format: [type: uint8][length: uint16 BE][payload: length bytes]
3function parseMessages(buffer: ArrayBuffer) {
4 const dv = new DataView(buffer);
5 let offset = 0;
6 const messages: { type: number; payload: Uint8Array }[] = [];
7
8 while (offset + 3 <= dv.byteLength) {
9 const type = dv.getUint8(offset);
10 const length = dv.getUint16(offset + 1, false); // big-endian
11 offset += 3;
12 if (offset + length > dv.byteLength) break; // truncated
13 const payload = new Uint8Array(buffer, offset, length);
14 messages.push({ type, payload });
15 offset += length;
16 }
17
18 return messages;
19}
20
21// Example usage
22const buf = new ArrayBuffer(1 + 2 + 3 + 1 + 2 + 2); // two messages
23const dv = new DataView(buf);
24let off = 0;
25// first message: type=1, length=3, payload=[1,2,3]
26dv.setUint8(off, 1); dv.setUint16(off + 1, 3, false); off += 3;
27new Uint8Array(buf, off, 3).set([1, 2, 3]); off += 3;
28// second message: type=2, length=2, payload=[9,8]
29dv.setUint8(off, 2); dv.setUint16(off + 1, 2, false); off += 3;
30new Uint8Array(buf, off, 2).set([9, 8]);
31
32console.log(parseMessages(buf));- Dalam contoh ini, header dibaca menggunakan
DataView, dan potongan payload dibuat denganUint8Array. Endianness dan pemeriksaan panjang buffer sangatlah penting.
Web API dan TypedArray (Contoh: mengambil data biner)
Ini adalah contoh umum menangani ArrayBuffer yang diperoleh dari permintaan jaringan menggunakan TypedArray.
1// Example of fetching binary and mapping to typed array
2async function fetchBinary(url: string) {
3 const res = await fetch(url);
4 const ab = await res.arrayBuffer();
5 const view = new Uint8Array(ab);
6 // process view...
7 console.log("received bytes:", view.length);
8 return view;
9}
10
11// Usage (call in async context)
12// fetchBinary("/path/to/file.bin");
- Anda dapat langsung meneruskan
ArrayBufferyang didapatkan denganResponse.arrayBuffer()keTypedArray. Ini digunakan untuk gambar, audio, atau protokol biner khusus.
Tips performa dan jebakan umum
Berikut beberapa 'tips performa' dan 'jebakan umum' yang berguna diketahui saat menggunakan TypedArray:.
-
Hindari penyalinan yang tidak perlu Untuk memproses data besar secara efisien, Anda dapat mengurangi penyalinan yang tidak diperlukan dengan membuat tampilan parsial menggunakan
subarrayatau membagikanArrayBufferyang sama di banyak tampilan. -
Berhati-hatilah dengan endianness Untuk komunikasi jaringan atau format file, urutan data (urutan byte) sering kali sudah ditentukan. Dengan menggunakan
DataView, Anda dapat menentukan endianness secara eksplisit saat membaca dan menulis, sehingga mencegah kesalahan interpretasi yang tidak diinginkan. -
Perhatikan rentang nilai untuk setiap tipe Misalnya,
Uint8hanya dapat mewakili nilai dari 0 hingga 255. Jika Anda memasukkan nilai negatif, pemotongan atau perputaran nilai dapat terjadi, jadi Anda harus menentukan aturan konversi sesuai kebutuhan. -
Pertimbangkan beban terhadap garbage collection Sering membuat ulang
ArrayBufferyang besar akan meningkatkan beban manajemen memori. Dalam situasi yang memerlukan kinerja tinggi, Anda dapat mempertimbangkan untuk merancang kode guna menggunakan kembali buffer yang sudah ada sebanyak mungkin.
Ringkasan
TypedArray adalah mekanisme untuk menangani data biner dengan cepat dan efisien. Dengan menggabungkan ArrayBuffer, yang mencadangkan area byte dengan panjang tetap, dengan TypedArray atau DataView, yang membaca dan menulis isi dengan tipe tertentu, Anda dapat melakukan operasi biner yang fleksibel. Tergantung pada kasus penggunaan Anda, Anda dapat memilih antara menggunakan subarray/slice atau DataView, serta merancang implementasi Anda dengan memperhatikan endianness dan salinan.
Anda dapat mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Silakan periksa juga saluran YouTube kami.