From c077b22410037559d0e8af9fedc6f0971a67b9ab Mon Sep 17 00:00:00 2001 From: n1474335 Date: Thu, 10 Jan 2019 17:30:52 +0000 Subject: [PATCH] Stream.readBits() method implemented. Unfinished. --- src/core/lib/FileSignatures.mjs | 12 +++++------- src/core/lib/Stream.mjs | 7 +++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/core/lib/FileSignatures.mjs b/src/core/lib/FileSignatures.mjs index b0eb5884..d8d97a2b 100644 --- a/src/core/lib/FileSignatures.mjs +++ b/src/core/lib/FileSignatures.mjs @@ -1438,10 +1438,8 @@ export function extractGZIP(bytes, offset) { while (!finalBlock) { // Read header - const blockHeader = stream.readBits(3); - - finalBlock = blockHeader & 0x1; - const blockType = blockHeader & 0x6; + finalBlock = stream.readBits(1); + const blockType = stream.readBits(2); if (blockType === 0) { // No compression @@ -1451,23 +1449,23 @@ export function extractGZIP(bytes, offset) { stream.moveForwardsBy(2 + blockLength); } else if (blockType === 1) { // Fixed Huffman + console.log("Fixed Huffman"); } else if (blockType === 2) { // Dynamic Huffman - + console.log("Dynamic Huffman"); } else { throw new Error("Invalid block type"); break; } } - /* FOOTER */ // Skip over checksum and size of original uncompressed input stream.moveForwardsBy(8); - console.log(stream.position); + console.log("Ending at " + stream.position); return stream.carve(); } diff --git a/src/core/lib/Stream.mjs b/src/core/lib/Stream.mjs index 2b5d8d09..886d4589 100644 --- a/src/core/lib/Stream.mjs +++ b/src/core/lib/Stream.mjs @@ -106,7 +106,7 @@ export default class Stream { bitBufLen = 0; // Add remaining bits from current byte - bitBuf = this.bytes[this.position++] & bitMask(this.bitPos); + bitBuf = (this.bytes[this.position++] & bitMask(this.bitPos)) >>> this.bitPos; bitBufLen = 8 - this.bitPos; this.bitPos = 0; @@ -119,7 +119,7 @@ export default class Stream { // Reverse back to numBits if (bitBufLen > numBits) { const excess = bitBufLen - numBits; - bitBuf >>>= excess; + bitBuf &= (1 << numBits) - 1; bitBufLen -= excess; this.position--; this.bitPos = 8 - excess; @@ -134,11 +134,10 @@ export default class Stream { * @returns {number} The bit mask */ function bitMask(bitPos) { - return (1 << (8 - bitPos)) - 1; + return 256 - (1 << bitPos); } } - /** * Consume the stream until we reach the specified byte or sequence of bytes. *