Signatur
Beschreibung
getFloat64() liest ab einer beliebigen Byte-Position im zugrunde liegenden ArrayBuffer genau 8 Byte und interpretiert sie als Gleitkommazahl mit doppelter Genauigkeit nach IEEE 754. Das ist dasselbe Format, das JavaScript intern für den Typ number verwendet. Der Wert kommt deshalb verlustfrei zurück.
Gebraucht wird die Methode vor allem beim Einlesen von Binärformaten: Netzwerkprotokolle über WebSocket, Dateiformate wie GeoTIFF, Shapefiles oder Audio-Metadaten, serialisierte Messdaten und WebAssembly-Speicher. Anders als ein Float64Array muss der Offset bei einem DataView nicht an 8 Byte ausgerichtet sein. Außerdem kannst du die Byte-Reihenfolge (Endianness) bei jedem Aufruf einzeln angeben.
Ohne zweites Argument liest die Methode in Big-Endian. Die meisten aktuellen Prozessoren (x86, ARM) und viele Dateiformate arbeiten dagegen mit Little-Endian. Gib littleEndian daher immer ausdrücklich an, damit du nicht versehentlich falsche Werte liest.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $byteOffset Pflicht | number | Position in Byte, gezählt vom Anfang der View (nicht des Buffers), ab der gelesen wird. Wird in eine ganze Zahl umgewandelt. byteOffset + 8 darf byteLength nicht überschreiten. |
|
| $littleEndian | boolean | false | true liest in Little-Endian, false oder weggelassen in Big-Endian. |
Rückgabewert
number sein, auch NaN, Infinity, -Infinity oder -0.Beispiele
Wert schreiben und wieder lesen
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setFloat64(0, Math.PI);
console.log(view.getFloat64(0));
Auswirkung der Byte-Reihenfolge
const view = new DataView(new ArrayBuffer(8));
view.setFloat64(0, 1.5, true); // als Little-Endian geschrieben
console.log(view.getFloat64(0, true)); // richtig gelesen
console.log(view.getFloat64(0)); // falsch: als Big-Endian gelesen
GPS-Koordinaten aus einem Binärpaket lesen
// Paketaufbau: [uint8 Typ][float64 Breite][float64 Länge], Little-Endian
const parsePosition = (arrayBuffer) => {
const view = new DataView(arrayBuffer);
return {
type: view.getUint8(0),
lat: view.getFloat64(1, true), // nicht ausgerichteter Offset ist erlaubt
lon: view.getFloat64(9, true),
};
};
// Testdaten erzeugen
const buf = new ArrayBuffer(17);
const w = new DataView(buf);
w.setUint8(0, 2);
w.setFloat64(1, 52.520008, true);
w.setFloat64(9, 13.404954, true);
console.log(parsePosition(buf));
Datei per fetch laden und Messwerte auslesen
const readSamples = async (url) => {
const response = await fetch(url);
const view = new DataView(await response.arrayBuffer());
const samples = [];
for (let offset = 0; offset + 8 <= view.byteLength; offset += 8) {
samples.push(view.getFloat64(offset, true));
}
return samples;
};
readSamples('/daten/messung.bin').then((s) => console.log(s.length, 'Werte'));
// Wichtig · Fallstricke
- Big-Endian ist die Voreinstellung: Wer
littleEndianweglässt, liest Little-Endian-Daten falsch, und zwar ohne Fehlermeldung. Es kommen einfach unsinnige Werte heraus. - RangeError: Die Methode wirft einen
RangeError, wennbyteOffsetnegativ ist oderbyteOffset + 8 > byteLengthgilt. Prüfe die Länge vor dem Lesen, gerade bei Daten aus dem Netzwerk. - Der Offset gilt relativ zur View, nicht zum Buffer. Wurde die View mit
new DataView(buf, 16)erzeugt, dann entsprichtgetFloat64(0)dem Byte 16 im Buffer. - TypeError: Die Methode wirft einen
TypeError, wenn derArrayBufferabgekoppelt (detached) ist, etwa nach einer Übertragung mitpostMessageoder nachtransfer(). - Das Bitmuster von
NaN(sein Nutzinhalt) bleibt beim Lesen nicht unbedingt erhalten. - Für große, ausgerichtete Datenmengen in der Byte-Reihenfolge des Rechners ist ein
Float64Arraymeist schneller. - Kompatibilität: Die Methode wird von allen aktuellen Browsern und von Node.js unterstützt. Sie funktioniert auch mit
SharedArrayBuffer.