UNPKG

@hamstudy/flamp

Version:

JavaScript Amateur Multicast Protocol AMP-2 Version 3 Implemented from specification document http://www.w1hkj.com/files/flamp/Amp-2.V3.0.Protocol.pdf • Version 1.0.0 - W5ALT, Walt Fair, Jr. (Derived From) • Version 2.0.0 - W1HKJ, Dave Freese, w

48 lines (47 loc) 2.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.crc16 = crc16; function crc16(message) { let table = []; for (let x = 0; x < 256; ++x) { let y = x; for (let z = 0; z < 8; ++z) { y = y & 1 ? 0xA001 ^ (y >>> 1) : y >>> 1; } table[x] = y >>> 0; } let crcval = 0xFFFF; if (message instanceof ArrayBuffer) { const msgUint8Array = new Uint8Array(message); for (let i = 0; i < length; ++i) { crcval = table[(crcval ^ msgUint8Array[i]) & 0xFF] ^ (crcval >>> 8); } } else { for (let i = 0; i < message.length; ++i) { let code = message.charCodeAt(i); if (code < 0x80) { crcval = table[(crcval ^ code) & 0xFF] ^ (crcval >>> 8); } else if (code < 0x800) { crcval = table[(crcval ^ (0xc0 | (code >> 6))) & 0xFF] ^ (crcval >>> 8); crcval = table[(crcval ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crcval >>> 8); } else if (code < 0xd800 || code >= 0xe000) { crcval = table[(crcval ^ (0xe0 | (code >> 12))) & 0xFF] ^ (crcval >>> 8); crcval = table[(crcval ^ (0x80 | ((code >> 6) & 0x3f))) & 0xFF] ^ (crcval >>> 8); crcval = table[(crcval ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crcval >>> 8); } else { code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++i) & 0x3ff)); crcval = table[(crcval ^ (0xf0 | (code >> 18))) & 0xFF] ^ (crcval >>> 8); crcval = table[(crcval ^ (0x80 | ((code >> 12) & 0x3f))) & 0xFF] ^ (crcval >>> 8); crcval = table[(crcval ^ (0x80 | ((code >> 6) & 0x3f))) & 0xFF] ^ (crcval >>> 8); crcval = table[(crcval ^ (0x80 | (code & 0x3f))) & 0xFF] ^ (crcval >>> 8); } } } const HEX_CHARS = '0123456789ABCDEF'.split(''); return HEX_CHARS[(crcval >> 12) & 0x0F] + HEX_CHARS[(crcval >> 8) & 0x0F] + HEX_CHARS[(crcval >> 4) & 0x0F] + HEX_CHARS[crcval & 0x0F]; } ;