UNPKG

extract-base-iterator

Version:

Base iterator for extract iterators like tar-iterator and zip-iterator

76 lines 2.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: Object.getOwnPropertyDescriptor(all, name).get }); } _export(exports, { get crc32 () { return crc32; }, get crc32Region () { return crc32Region; }, get verifyCrc32 () { return verifyCrc32; }, get verifyCrc32Region () { return verifyCrc32Region; } }); /** * CRC32 calculation for archive formats * * Uses IEEE polynomial 0xEDB88320 (same as ZIP, 7z, PNG, gzip, etc.) * All bit operations (>>>, ^, &) work correctly in Node 0.8 * * This is the standard CRC-32 algorithm used by: * - ZIP/PKZIP * - 7-Zip * - PNG * - gzip * - Ethernet */ // Pre-computed lookup table for performance var CRC32_TABLE = []; // Initialize table at module load time (function initTable() { for(var i = 0; i < 256; i++){ var c = i; for(var j = 0; j < 8; j++){ if ((c & 1) !== 0) { c = 0xedb88320 ^ c >>> 1; } else { c = c >>> 1; } } CRC32_TABLE[i] = c >>> 0; // Ensure unsigned } })(); function crc32(buf, initial) { var crc = initial === undefined ? 0xffffffff : ~initial >>> 0; for(var i = 0; i < buf.length; i++){ var index = (crc ^ buf[i]) & 0xff; crc = CRC32_TABLE[index] ^ crc >>> 8; } return ~crc >>> 0; // Return unsigned } function crc32Region(buf, offset, length, initial) { var crc = initial === undefined ? 0xffffffff : ~initial >>> 0; var end = offset + length; for(var i = offset; i < end; i++){ var index = (crc ^ buf[i]) & 0xff; crc = CRC32_TABLE[index] ^ crc >>> 8; } return ~crc >>> 0; // Return unsigned } function verifyCrc32(buf, expected) { return crc32(buf) === expected >>> 0; } function verifyCrc32Region(buf, offset, length, expected) { return crc32Region(buf, offset, length) === expected >>> 0; } /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }