From 070e32bb747c54c16d6ffc7dcde758323b65003a Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Wed, 22 Jan 2025 23:08:16 -0600 Subject: [PATCH] replace DataView with inline bit twiddling --- src/decoders/data/data-packet-chunk.ts | 3 +-- src/decoders/info/info-packet-chunk.ts | 3 +-- src/decoders/info/info-tracker-chunk.ts | 3 +-- src/decoders/packet-header-chunk.ts | 11 +++++++++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/decoders/data/data-packet-chunk.ts b/src/decoders/data/data-packet-chunk.ts index 0519f32..3abe622 100644 --- a/src/decoders/data/data-packet-chunk.ts +++ b/src/decoders/data/data-packet-chunk.ts @@ -10,8 +10,7 @@ export default (buffer: Uint8Array): DataPacketChunk => { if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { let offset = 0; while (offset < chunk.header.dataLen) { - const view = new DataView(chunk.chunkData.buffer, chunk.chunkData.byteOffset, chunk.chunkData.byteLength); - const chunkId = view.getUint16(offset, true); + const chunkId = (chunk.chunkData.subarray(offset)[1] << 8) + chunk.chunkData.subarray(offset)[0]; switch (chunkId) { case 0x0000: data.packetHeader = Decoders.PacketHeaderChunk(chunk.chunkData.subarray(offset)); diff --git a/src/decoders/info/info-packet-chunk.ts b/src/decoders/info/info-packet-chunk.ts index e102d82..2d3d603 100644 --- a/src/decoders/info/info-packet-chunk.ts +++ b/src/decoders/info/info-packet-chunk.ts @@ -10,8 +10,7 @@ export default (buffer: Uint8Array): InfoPacketChunk => { if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { let offset = 0; while (offset < chunk.header.dataLen) { - const view = new DataView(chunk.chunkData.buffer, chunk.chunkData.byteOffset, chunk.chunkData.byteLength); - const chunkId = view.getUint16(offset, true); + const chunkId = (chunk.chunkData.subarray(offset)[1] << 8) + chunk.chunkData.subarray(offset)[0]; switch (chunkId) { case 0x0000: data.packetHeader = Decoders.PacketHeaderChunk(chunk.chunkData.subarray(offset)); diff --git a/src/decoders/info/info-tracker-chunk.ts b/src/decoders/info/info-tracker-chunk.ts index 6a41fb8..feb7095 100644 --- a/src/decoders/info/info-tracker-chunk.ts +++ b/src/decoders/info/info-tracker-chunk.ts @@ -8,8 +8,7 @@ export default (buffer: Uint8Array): InfoTrackerChunk => { if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { let offset = 0; while (offset < chunk.header.dataLen) { - const view = new DataView(chunk.chunkData.buffer, chunk.chunkData.byteOffset, chunk.chunkData.byteLength); - const chunkId = view.getUint16(offset, true); + const chunkId = (chunk.chunkData.subarray(offset)[1] << 8) + chunk.chunkData.subarray(offset)[0]; switch (chunkId) { case 0x0000: { const data: InfoTrackerChunkData = { diff --git a/src/decoders/packet-header-chunk.ts b/src/decoders/packet-header-chunk.ts index 5919985..b541f96 100644 --- a/src/decoders/packet-header-chunk.ts +++ b/src/decoders/packet-header-chunk.ts @@ -4,9 +4,16 @@ import { PacketHeaderChunk, PacketHeaderChunkData } from '../models/packet-heade export default (buffer: Uint8Array): PacketHeaderChunk => { const chunk = Decoders.Chunk(buffer); - const view = new DataView(chunk.chunkData.buffer, chunk.chunkData.byteOffset, chunk.chunkData.byteLength); + let packetTimestamp = BigInt(chunk.chunkData[7]) << BigInt(56); + packetTimestamp += BigInt(chunk.chunkData[6]) << BigInt(48); + packetTimestamp += BigInt(chunk.chunkData[5]) << BigInt(40); + packetTimestamp += BigInt(chunk.chunkData[4]) << BigInt(32); + packetTimestamp += BigInt(chunk.chunkData[3]) << BigInt(24); + packetTimestamp += BigInt(chunk.chunkData[2]) << BigInt(16); + packetTimestamp += BigInt(chunk.chunkData[1]) << BigInt(8); + packetTimestamp += BigInt(chunk.chunkData[0]); const data: PacketHeaderChunkData = { - packetTimestamp: view.getBigUint64(0, true), + packetTimestamp, versionHigh: chunk.chunkData[8], versionLow: chunk.chunkData[9], frameId: chunk.chunkData[10],