`DataView` dalam JavaScript
Artikel ini menjelaskan DataView
dalam JavaScript.
Kami akan menjelaskan secara rinci penggunaan dasar DataView
dan contoh spesifik penggunaannya.
YouTube Video
DataView
dalam JavaScript
DataView
JavaScript adalah API yang nyaman untuk memanipulasi data yang disimpan dalam buffer (ArrayBuffer
) dalam berbagai format. Ini memungkinkan pembacaan dan penulisan data biner secara fleksibel dan efisien, memainkan peran penting dalam komunikasi jaringan, pemrosesan file, dan interfacing dengan WebAssembly.
Apa itu DataView
?
DataView
menyediakan lapisan tampilan di atas objek ArrayBuffer
, memungkinkan Anda membaca dan menulis berbagai tipe data (seperti bilangan bulat, bilangan floating-point, dan karakter) dari offset byte tertentu. DataView
mirip dengan TypedArray
, tetapi memiliki karakteristik kemampuan untuk menentukan endianness dan melakukan operasi rinci pada level byte.
Sintaks Dasar DataView
1let buffer = new ArrayBuffer(16); // Create a 16-byte ArrayBuffer
2let view = new DataView(buffer); // Manipulate the buffer with a DataView
DataView
memiliki konstruktor yang menerima ArrayBuffer
sebagai argumen. Dalam contoh ini, buffer 16-byte dibuat, dan DataView
digunakan untuk mengakses buffer tersebut. Dengan menggunakan DataView
, Anda dapat menentukan ukuran byte yang berbeda dan endianness (big-endian atau little-endian) saat membaca atau menulis data yang disimpan dalam buffer.
Metode Dasar DataView
DataView
menyediakan metode untuk membaca dan menulis nilai dari berbagai tipe data. Ini dibagi terutama menjadi metode get
untuk membaca data dan metode set
untuk menulis.
Metode utama ditunjukkan di bawah ini.
Metode untuk Membaca Nilai
getInt8(byteOffset)
: Membaca bilangan bulat bertanda 1-byte pada offset yang ditentukan.getUint8(byteOffset)
: Membaca bilangan bulat tak bertanda 1-byte pada offset yang ditentukan.getInt16(byteOffset, littleEndian)
: Membaca bilangan bulat bertanda 2-byte.getUint16(byteOffset, littleEndian)
: Membaca bilangan bulat tak bertanda 2-byte.getInt32(byteOffset, littleEndian)
: Membaca bilangan bulat bertanda 4-byte.getUint32(byteOffset, littleEndian)
: Membaca bilangan bulat tak bertanda 4-byte.getFloat32(byteOffset, littleEndian)
: Membaca bilangan floating-point IEEE 754 4-byte.getFloat64(byteOffset, littleEndian)
: Membaca bilangan floating-point IEEE 754 8-byte.
Metode untuk Menulis Nilai
setInt8(byteOffset, value)
: Menulis integer bertanda 1-byte.setUint8(byteOffset, value)
: Menulis integer tak bertanda 1-byte.setInt16(byteOffset, value, littleEndian)
: Menulis integer bertanda 2-byte.setUint16(byteOffset, value, littleEndian)
: Menulis integer tak bertanda 2-byte.setInt32(byteOffset, value, littleEndian)
: Menulis integer bertanda 4-byte.setUint32(byteOffset, value, littleEndian)
: Menulis integer tak bertanda 4-byte.setFloat32(byteOffset, value, littleEndian)
: Menulis bilangan floating-point IEEE 754 4-byte.setFloat64(byteOffset, value, littleEndian)
: Menulis bilangan floating-point IEEE 754 8-byte.
Dengan menggunakan metode ini, Anda dapat secara fleksibel membaca dan menulis data yang disimpan di ArrayBuffer
.
Contoh menggunakan DataView
Mari kita lihat contoh memanipulasi data biner menggunakan DataView
.
Contoh 1: Menulis dan membaca integer 16-bit
1let buffer = new ArrayBuffer(4); // Create a 4-byte buffer
2let view = new DataView(buffer);
3
4// Write a 2-byte integer value in little-endian format
5view.setInt16(0, 32767, true); // byteOffset: 0, value: 32767, littleEndian: true
6
7// Read the data in little-endian format
8let value = view.getInt16(0, true);
9console.log(value); // Output: 32767
- Dalam contoh ini, metode
setInt16
digunakan untuk menulis integer bertanda 16-bit dalam format little-endian, dan metodegetInt16
membaca nilai tersebut menggunakan little-endian.
Contoh 2: Menulis dan membaca bilangan floating-point
1let buffer = new ArrayBuffer(8); // Create an 8-byte buffer
2let view = new DataView(buffer);
3
4// Write an 8-byte floating-point number
5view.setFloat64(0, 3.14159, false); // byteOffset: 0, value: 3.14159, bigEndian: false
6
7// Read the data in big-endian format
8let pi = view.getFloat64(0, false);
9console.log(pi); // Output: 3.14159
- Dalam contoh ini, metode
setFloat64
digunakan untuk menulis bilangan floating-point 64-bit dalam format big-endian, dan nilai tersebut dibaca menggunakangetFloat64
.
Tentang Endian
Mari kita lihat contoh membaca dan menulis nilai dalam format big-endian dan little-endian menggunakan DataView
.
1// Example: Handling Endianness with DataView in TypeScript
2// Create an ArrayBuffer of 4 bytes
3const buffer = new ArrayBuffer(4);
4const view = new DataView(buffer);
5
6// Store the same number (0x12345678) in both endian formats
7// By default, DataView uses big-endian
8view.setUint32(0, 0x12345678); // Big-endian
9console.log("Big-endian (default):");
10console.log(buffer);
11
12// Overwrite the buffer with little-endian
13view.setUint32(0, 0x12345678, true); // Little-endian
14console.log("Little-endian:");
15console.log(buffer);
16
17// Read values back in both endian modes
18const bigEndianValue = view.getUint32(0); // Big-endian read
19const littleEndianValue = view.getUint32(0, true); // Little-endian read
20
21console.log("Read as Big-endian:", bigEndianValue.toString(16));
22console.log("Read as Little-endian:", littleEndianValue.toString(16));
Dalam metode DataView
, data secara default disimpan dalam format big-endian (urutan byte dari byte paling signifikan ke byte paling tidak signifikan), tetapi little-endian dapat ditentukan secara opsional. Little-endian membalikkan urutan byte (dari byte paling tidak signifikan ke byte paling signifikan). Penting untuk menangani endianness data dengan benar karena sistem dan protokol jaringan yang berbeda menggunakan endianness yang berbeda.
Perbedaan dengan TypedArray
Mari kita lihat perbedaan antara DataView
dan TypedArray
.
1// Example: TypedArray vs DataView
2
3// Create a 8-byte buffer
4const buffer = new ArrayBuffer(8);
5
6// --- Using TypedArray (Int32Array) ---
7const int32View = new Int32Array(buffer);
8int32View[0] = 42;
9int32View[1] = 100;
10
11console.log("TypedArray (Int32Array):");
12console.log(int32View); // Int32Array [42, 100]
13
14// --- Using DataView ---
15const dataView = new DataView(buffer);
16
17// Write different types of data at arbitrary byte offsets
18dataView.setInt8(0, 65); // 1 byte
19dataView.setUint16(1, 500, true); // 2 bytes, little-endian
20dataView.setFloat32(3, 3.14, true); // 4 bytes, little-endian
21
22console.log("\nDataView:");
23console.log("Int8 at 0:", dataView.getInt8(0)); // 65
24console.log("Uint16 at 1:", dataView.getUint16(1, true)); // 500
25console.log("Float32 at 3:", dataView.getFloat32(3, true)); // 3.14
26
27/*
28Output:
29TypedArray (Int32Array):
30Int32Array [42, 100]
31
32DataView:
33Int8 at 0: 65
34Uint16 at 1: 500
35Float32 at 3: 3.140000104904175
36*/
TypedArray
juga menyediakan operasi buffer yang berbasis ArrayBuffer
, tetapi TypedArray
cocok untuk memproses data kontinu dengan panjang dan format tetap untuk setiap jenis data. Sebaliknya, DataView
dapat memproses berbagai jenis data secara fleksibel dan juga memungkinkan kontrol atas endian. Oleh karena itu, DataView
cocok untuk mem-parsing dan membangun data biner yang kompleks.
Ringkasan
DataView
adalah API yang kuat untuk menangani data biner di JavaScript. Anda dapat langsung mengakses ArrayBuffer
untuk membaca dan menulis data sambil mempertimbangkan bilangan bulat, angka floating-point, dan perbedaan endianness. Hal ini berguna dalam situasi seperti komunikasi jaringan dan parsing format file, serta sangat penting saat diperlukan kontrol tingkat byte. Dengan menggunakannya bersama dengan TypedArray
, Anda dapat melakukan manipulasi data biner dengan lebih efisien.
Anda dapat mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Silakan periksa juga saluran YouTube kami.