javascript / expert
Snippet
Zero-Copy-Binärparsing mittels TypedArray-Views und ArrayBuffer-Slicing
DataView und TypedArray-Views ermöglichen hochperformantes Parsing binärer Protokolle direkt auf bestehendem ArrayBuffer-Speicher ohne Allokation kopierter Zwischen-Arrays.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
import { Buffer } from 'node:buffer';function parseBinaryFrame(rawBuffer) {const view = new DataView(rawBuffer.buffer, rawBuffer.byteOffset, rawBuffer.byteLength);const magicHeader = view.getUint32(0, false);const payloadLength = view.getUint16(4, false);const payloadBytes = new Uint8Array(rawBuffer.buffer, rawBuffer.byteOffset + 6, payloadLength);return { magicHeader, payloadLength, payloadBytes };}const frame = Buffer.from([0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x04, 0x48, 0x45, 0x4C, 0x4F]);const parsed = parseBinaryFrame(frame);
nodejs
Erklärung
1
import { Buffer } from 'node:buffer';
Importiert das native Node.js Buffer-Modul unter Verwendung der node:-Protokollsyntax.
2
function parseBinaryFrame(rawBuffer) {
Deklariert die Parser-Funktion, die ein Node.js Buffer oder Uint8Array akzeptiert.
3
const view = new DataView(rawBuffer.buffer, rawBuffer.byteOffset, rawBuffer.byteLength);
Erstellt ein DataView über dem genauen zugrundeliegenden ArrayBuffer-Speichersegment.
4
const magicHeader = view.getUint32(0, false);
Liest einen vorzeichenlosen 32-Bit Big-Endian Integer-Header ab Offset 0.
5
const payloadLength = view.getUint16(4, false);
Liest eine 16-Bit Big-Endian Nutzlastlänge ab Offset 4.
6
const payloadBytes = new Uint8Array(rawBuffer.buffer, rawBuffer.byteOffset + 6, payloadLength);
Erstellt eine Zero-Copy Uint8Array-View über die Nutzlast-Bytes ohne Speicherverdopplung.
7
return { magicHeader, payloadLength, payloadBytes };
Gibt die geparsten binären Datenfelder zurück.
8
const frame = Buffer.from([0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x04, 0x48, 0x45, 0x4C, 0x4F]);
Allokiert einen Beispiel-Binärprotokoll-Paketpuffer.
9
const parsed = parseBinaryFrame(frame);
Führt das Zero-Copy-Parsing über den Paketpuffer aus.