DataView
DataView obyekti ArrayBuffer ichida istalgan bayt siljishida (offset) bir nechta sonli tiplarni o‘qish va yozish imkonini beradi, bunda endianness (bayt tartibi) ixtiyoriy ravishda boshqarilishi mumkin.
DataView nima?
DataView - bu ArrayBufferning yuqori qismidagi ko‘rinish.
DataView o‘z-o‘zidan ma’lumotlarni saqlamaydi; Buning o‘rniga, buferdagi baytlarni turli xil turlari sifatida izohlash imkonini beradi:
- 8-bit, 16-bit, 32-bitli tamsayılar (imzoli va imzosiz)
- 32 bitli va 64 bitli suzuvchi nuqtali sonlar
- Buferda ixtiyoriy bayt ofsetlarida
- Sozlanadigan little-endian yoki big-endian tartibi bilan
DataView dan quyidagi hollarda foydalaning:
- Sizda har xil turdagi va o‘lchamdagi maydonlar bilan ikkilik format mavjud.
- Bayt tartibini (endianness) boshqarishingiz kerak bo‘lganda.
Uint8ArrayyokiFloat32Arraykabi tiplangan massivlar yetarlicha moslashuvchan emas.
Ikkilik ma’lumotlar bilan ishlaganingizda DataView-dan bayt tartibi va turlarini to‘liq nazorat qilishingiz kerak bo‘lganda foydalaning (masalan, tarmoq paketlari, fayl formatlari yoki boshqa tillar bilan o‘zaro ishlash).
DataView yaratish
DataView yaratish uchun sizga ArrayBuffer kerak bo‘ladi.
Keyin ArrayBuffer ni new DataView() konstruktoriga o‘tkazasiz:
Misol
// Create a 16 bytes ArrayBuffer
const buffer = new ArrayBuffer(16);
// Create a new DataView
const view = new DataView(buffer);
// Get lengths and offset
let len1 = buffer.byteLength);
let len2 = view.byteLength;
let off1 = view.byteOffset;
O‘zingiz sinab ko‘ring »
Bundan tashqari, ma’lum bir ofsetdan boshlanadigan va cheklangan uzunlikka ega bo‘lgan DataView yaratishingiz mumkin:
Misol
4-siljishdan (offset) boshlanadi, uzunligi 8 ga teng:
// Create a 16 bytes ArrayBuffer
const buffer = new ArrayBuffer(16);
// Create a new DataView
const view = new DataView(buffer, 4, 8);
// Get lengths and offset
let len1 = buffer.byteLength);
let len2 = view.byteLength;
let off1 = view.byteOffset;
O‘zingiz sinab ko‘ring »
Bir nechta DataView va tiplangan massiv ko‘rinishlari (view) bir xil ArrayBufferni baham ko‘rishi mumkin.
DataView qiymatlarini o‘qish va yozish
DataView qiymatlarni o‘qish va yozish uchun getXxx() va setXxx() usullaridan foydalanadi:
- getInt8(), setInt8()
- getUint16(), setUint16()
- getInt32(), setInt32()
- getFloat32(), setFloat32()
- va boshqalar
Misol
getInt32() va setInt32()
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
// Write a 32-bit signed integer at byte offset 0
view.setInt32(0, 123456);
// Read it back
const value = view.getInt32(0);
console.log(value); // 123456
Misol
getFloat64() va setFloat64()
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer);
view.setFloat64(0, Math.PI);
view.setFloat64(8, Math.E);
const pi = view.getFloat64(0);
const e = view.getFloat64(8);
console.log("PI:", pi);
console.log("E:", e);
byteOffset qiymatidan) hisoblangan bayt siljishi (offset) bo‘ladi.Endianness (baytlar tartibi)
Ko‘plab binar formatlar ko‘p baytli sonlar little-endian yoki big-endian tartibida saqlanishini belgilaydi.
- Little-endian: eng kichik ahamiyatli bayt birinchi keladi (shaxsiy kompyuterlarda eng keng tarqalgan).
- Big-endian: birinchi navbatda eng muhim bayt (ba’zi protokollarda keng tarqalgan).
Aksariyat DataView raqamli usullarda ixtiyoriy mavjud
littleEndian parametri:
true= little-endianfalse(or omitted) = big-endian
Misol: Little-Endian va Big-Endian bilan yozish
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
// Same number, two different byte orders:
view.setUint32(0, 0x12345678, true); // little-endian
console.log(new Uint8Array(buffer));
// Example output: Uint8Array(4) [120, 86, 52, 18] (0x78, 0x56, 0x34, 0x12)
// Overwrite with big-endian
view.setUint32(0, 0x12345678, false); // big-endian
console.log(new Uint8Array(buffer));
// Example output: Uint8Array(4) [18, 52, 86, 120] (0x12, 0x34, 0x56, 0x78)
Bitta buferda aralash tiplar
DataView ning asosiy afzalliklaridan biri shundaki, siz har xil turlarni bitta buferda aralashtirishingiz mumkin. Masalan:
- Bayroq (flag) uchun 1 bayt
- Uzunlik uchun 2 bayt
- Float son uchun 4 bayt
Misol: aralash tiplar
const buffer = new ArrayBuffer(12);
const view = new DataView(buffer);
// Byte 0: a flag (0 or 1)
view.setUint8(0, 1);
// Bytes 1-2: a 16-bit length (little-endian)
view.setUint16(1, 500, true);
// Bytes 4-11: a 64-bit float (skip byte 3 for alignment)
view.setFloat64(4, 3.14159, true);
// Read the values back
const flag = view.getUint8(0);
const length = view.getUint16(1, true);
const value = view.getFloat64(4, true);
console.log("Flag:", flag);
console.log("Length:", length);
console.log("Value:", value);
Xulosa
DataView- buArrayBuffer-da bir nechta raqamli turlarni o‘qish va yozishning moslashuvchan usuli.getXxx()vasetXxx()metodlaridan bayt siljishi (va ixtiyoriy endianness) bilan foydalaning.- Ikkilik protokollar, fayl formatlari va boshqa tillar bilan birgalikda ishlash uchun juda yaxshi.
- Alohida baytlarni osongina tekshirish uchun
DataViewni tiplangan massivlar bilan birgalikda ishlating.
Keng tarqalgan qo‘llanilish holatlari
- Parsing binary file formats (images, audio, custom formats).
- WebSocket yoki WebRTC tepasida ikkilik tarmoq protokollarini amalga oshirish.
- Tartib muhim bo‘lgan joyda WebAssembly yoki mahalliy kod bilan o‘zaro hamkorlik qiling.
- JavaScript-da C/C++ uslubidagi tuzilmalar va birlashmalarni qayta joriy qilish.
DataView ma’lumotnomasi
Qayta ko‘rib chiqilgan: 2025-yil dekabr
Constructor
| Sintaksis | Tavsif |
|---|---|
new DataView(buffer) |
View on entire ArrayBuffer. |
new DataView(buffer, byteOffset) |
byteOffset dan oxirigacha ko‘rish. |
new DataView(buffer, byteOffset, byteLength) |
View of length byteLength starting at byteOffset. |
Xususiyatlar
| Xususiyat | Tavsif |
|---|---|
dataView.buffer |
Asosiy ArrayBuffer. |
dataView.byteLength |
Ushbu ko‘rinishdagi baytlar soni. |
dataView.byteOffset |
Ushbu ko‘rinishning (view) bufer boshidan siljishi (baytlarda). |
O‘qish metodlari (get)
| Metod | Tavsif |
|---|---|
getInt8(byteOffset) |
8 bitli ishorali butun sonni o‘qiydi. |
getUint8(byteOffset) |
8 bitli ishorasiz butun sonni o‘qiydi. |
getInt16(byteOffset, littleEndian?) |
16 bitli ishorali butun sonni o‘qiydi. |
getUint16(byteOffset, littleEndian?) |
16 bitli ishorasiz butun sonni o‘qiydi. |
getInt32(byteOffset, littleEndian?) |
32 bitli ishorali butun sonni o‘qiydi. |
getUint32(byteOffset, littleEndian?) |
32 bitli ishorasiz butun sonni o‘qiydi. |
getFloat32(byteOffset, littleEndian?) |
32 bitli suzuvchi nuqtali sonni o‘qiydi. |
getFloat64(byteOffset, littleEndian?) |
64 bitli suzuvchi nuqtali sonni o‘qiydi. |
getBigInt64(byteOffset, littleEndian?) |
64 bitli ishorali butun sonni BigInt sifatida o‘qiydi. |
getBigUint64(byteOffset, littleEndian?) |
64 bitli ishorasiz butun sonni BigInt sifatida o‘qiydi. |
Yozish metodlari (set)
| Metod | Tavsif |
|---|---|
setInt8(byteOffset, value) |
8 bitli ishorali butun sonni yozadi. |
setUint8(byteOffset, value) |
8 bitli ishorasiz butun sonni yozadi. |
setInt16(byteOffset, value, littleEndian?) |
16 bitli ishorali butun sonni yozadi. |
setUint16(byteOffset, value, littleEndian?) |
16 bitli ishorasiz butun sonni yozadi. |
setInt32(byteOffset, value, littleEndian?) |
32 bitli ishorali butun sonni yozadi. |
setUint32(byteOffset, value, littleEndian?) |
32 bitli ishorasiz butun sonni yozadi. |
setFloat32(byteOffset, value, littleEndian?) |
32 bitli suzuvchi nuqtali sonni yozadi. |
setFloat64(byteOffset, value, littleEndian?) |
64 bitli suzuvchi nuqtali sonni yozadi. |
setBigInt64(byteOffset, value, littleEndian?) |
Writes a 64-bit signed integer BigInt. |
setBigUint64(byteOffset, value, littleEndian?) |
Writes a 64-bit unsigned integer BigInt. |
Batafsil bilib oling:
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
