`DataView` i JavaScript
Den här artikeln förklarar DataView
i JavaScript.
Vi kommer att förklara i detalj den grundläggande användningen av DataView
och ge specifika exempel på dess användning.
YouTube Video
DataView
i JavaScript
JavaScripts DataView
är ett praktiskt API för att hantera data som lagras i en buffert (ArrayBuffer
) i olika format. Detta möjliggör flexibel och effektiv läsning och skrivning av binärdata och spelar en viktig roll inom nätverkskommunikation, filbearbetning och interaktion med WebAssembly.
Vad är DataView
?
DataView
erbjuder ett visningslager ovanpå ett ArrayBuffer
-objekt, som gör det möjligt att läsa och skriva olika datatyper (såsom heltal, flyttal och tecken) från valfri byteoffset. DataView
liknar TypedArray
, men utmärks av sin förmåga att specificera endianness och utföra detaljerade operationer på byte-nivå.
Grundläggande syntax för DataView
1let buffer = new ArrayBuffer(16); // Create a 16-byte ArrayBuffer
2let view = new DataView(buffer); // Manipulate the buffer with a DataView
DataView
har en konstruktor som tar ett ArrayBuffer
som ett argument. I det här exemplet skapas en 16-byte buffert, och DataView
används för att få tillgång till denna buffert. Med DataView
kan du specificera olika byte-storlekar och endianness (big-endian eller little-endian) vid läsning från eller skrivning till data lagrad i en buffert.
Grundläggande metoder för DataView
DataView
erbjuder metoder för att läsa och skriva värden av olika datatyper. De delas huvudsakligen in i get
-metoder för dataläsning och set
-metoder för skrivning.
De huvudsakliga metoderna visas nedan.
Metoder för att läsa värden
getInt8(byteOffset)
: Läser ett 1-byte signerat heltal vid den angivna offseten.getUint8(byteOffset)
: Läser ett 1-byte osignerat heltal vid den angivna offseten.getInt16(byteOffset, littleEndian)
: Läser ett 2-byte signerat heltal.getUint16(byteOffset, littleEndian)
: Läser ett 2-byte osignerat heltal.getInt32(byteOffset, littleEndian)
: Läser ett 4-byte signerat heltal.getUint32(byteOffset, littleEndian)
: Läser ett 4-byte osignerat heltal.getFloat32(byteOffset, littleEndian)
: Läser ett 4-byte IEEE 754 flyttal.getFloat64(byteOffset, littleEndian)
: Läser ett 8-bytes IEEE 754 flyttal.
Metoder för att skriva värden
setInt8(byteOffset, value)
: Skriver ett 1-byte signerat heltal.setUint8(byteOffset, value)
: Skriver ett 1-byte osignerat heltal.setInt16(byteOffset, value, littleEndian)
: Skriver ett 2-byte signerat heltal.setUint16(byteOffset, value, littleEndian)
: Skriver ett 2-byte osignerat heltal.setInt32(byteOffset, value, littleEndian)
: Skriver ett 4-byte signerat heltal.setUint32(byteOffset, value, littleEndian)
: Skriver ett 4-byte osignerat heltal.setFloat32(byteOffset, value, littleEndian)
: Skriver ett 4-byte IEEE 754 flyttal.setFloat64(byteOffset, value, littleEndian)
: Skriver ett 8-byte IEEE 754 flyttal.
Genom att använda dessa metoder kan du flexibelt läsa och skriva data lagrad i en ArrayBuffer
.
Exempel på användning av DataView
Låt oss titta på ett exempel på hur man manipulerar binär data med hjälp av DataView
.
Exempel 1: Skriva och läsa ett 16-bitars heltal
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
- I detta exempel används metoden
setInt16
för att skriva ett 16-bitars signerat heltal i little-endian-format, och metodengetInt16
läser värdet i little-endian.
Exempel 2: Skriva och läsa ett flyttal
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
- I detta exempel används metoden
setFloat64
för att skriva ett 64-bitars flyttal i big-endian-format, och värdet läses medgetFloat64
.
Om endianness
Låt oss se ett exempel på att läsa och skriva värden i både big-endian och little-endian-format med hjälp av 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));
I DataView
-metoder lagras data i big-endian (byteordning från mest signifikanta till minst signifikanta byte) som standard, men little-endian kan anges som alternativ. Little-endian vänder byteordningen (från minst signifikanta till mest signifikanta byte). Det är viktigt att hantera data-endianness korrekt eftersom olika system och nätverksprotokoll använder olika endianness.
Skillnad från TypedArray
Låt oss se skillnaderna mellan DataView
och 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
tillhandahåller också buffertoperationer baserade på ArrayBuffer
, men TypedArray
är lämplig för att hantera sammanhängande data med fast längd och format för varje datatyp. Å andra sidan kan DataView
flexibelt hantera olika datatyper och tillåter även kontroll över endianness. Därför är DataView
lämplig för att tolka och konstruera komplex binärdata.
Sammanfattning
DataView
är ett kraftfullt API för att hantera binär data i JavaScript. Du kan direkt komma åt ArrayBuffer
för att läsa och skriva data med hänsyn till heltal, flyttal och skillnader i endianness. Det är användbart i situationer som nätverkskommunikation och filformatparsing, och är oumbärligt när byte-nivåkontroll krävs. Genom att använda det tillsammans med TypedArray
kan du utföra mer effektiv binär datamanipulation.
Du kan följa med i artikeln ovan med hjälp av Visual Studio Code på vår YouTube-kanal. Vänligen kolla även in YouTube-kanalen.