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.

ULASHISH

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.
  • Uint8Array yoki Float32Array kabi 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);
Eslatma: Birinchi argument har doim asosiy bufer boshidan (yoki view’ning 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-endian
  • false (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)
Maslahat: Qaysi baytlar tartibini (endianness) ishlatish kerakligini bilish uchun har doim fayl formatingiz yoki protokolingiz hujjatlarini tekshiring.

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 - bu ArrayBuffer-da bir nechta raqamli turlarni o‘qish va yozishning moslashuvchan usuli.
  • getXxx() va setXxx() 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.


W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!