UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

64 lines 5.6 kB
import { NumberConverter } from '../converter/body/number-converter'; let _mpeg2Instance; export class CRC { constructor(polynomial) { this.polynomial = polynomial; } static mpeg2() { if (!_mpeg2Instance) { _mpeg2Instance = new CRC(CRC.POLYNOMIAL_CRC32_MPEG2); } return _mpeg2Instance; } compute(buffer, firstValue = CRC.FIRST_VALUE) { if (buffer instanceof Uint32Array) { return CRC.fromWord(buffer, firstValue, this.polynomial); } else { return CRC.fromBytes(buffer, firstValue, this.polynomial); } } static fromBytes(data, crc = CRC.FIRST_VALUE, polynomial = CRC.POLYNOMIAL_CRC32_MPEG2) { if (data.length % CRC.MODULO !== 0) { throw new Error(`Cannot compute CRC, input size must be a multiple of 4. Length is ${data.length} % ${CRC.MODULO} = ${data.length % CRC.MODULO}`); } const uint32Data = new Uint32Array(data.length / 4); for (let offset = 0; offset < uint32Data.byteLength; offset++) { uint32Data[offset] = NumberConverter.fromOpaqueMsb(data.slice(offset * 4, (offset + 1) * 4), 32); } return CRC.fromWord(uint32Data, crc, polynomial); } // crc 32 calculation by word. static fromWord(buffer, crc = CRC.FIRST_VALUE, polynomial = CRC.POLYNOMIAL_CRC32_MPEG2) { // don't follow null pointers if (!buffer) { throw new Error('Buffer is null'); } // don't accept buffers larger than 16MB if (buffer.byteLength > 16 * 1024 * 1024) { throw new Error('Buffers larger than 16MB'); } let myword; for (let i = 0; i < buffer.length; i++) { myword = buffer[i]; // Get next word. crc = CRC.appendCrcNumber(crc, myword, polynomial); } return crc; } static appendCrcNumber(crc, data, polynomial) { crc = crc ^ data; for (let i = 0; i < 32; i++) { if (crc & 0x80000000) { crc = ((crc << 1) ^ polynomial) >>> 0; } else { crc = (crc << 1) >>> 0; } } return crc; } } CRC.POLYNOMIAL_CRC32_MPEG2 = 0x4c11db7; CRC.MODULO = 4; CRC.FIRST_VALUE = 0xffffffff; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY2xpZW50L2ltcGwvc3JjL2xpYi9lcnJvci1kZXRlY3Rpb24vY3JjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRSxJQUFJLGNBQStCLENBQUM7QUFFcEMsTUFBTSxPQUFPLEdBQUc7SUFhZCxZQUE0QixVQUFrQjtRQUFsQixlQUFVLEdBQVYsVUFBVSxDQUFRO0lBQUcsQ0FBQztJQVBsRCxNQUFNLENBQUMsS0FBSztRQUNWLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbkIsY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUlNLE9BQU8sQ0FDWixNQUFnQyxFQUNoQyxhQUFxQixHQUFHLENBQUMsV0FBVztRQUVwQyxJQUFJLE1BQU0sWUFBWSxXQUFXLEVBQUU7WUFDakMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFEO2FBQU07WUFDTCxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQVMsQ0FDckIsSUFBZ0IsRUFDaEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQ3JCLGFBQXFCLEdBQUcsQ0FBQyxzQkFBc0I7UUFFL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQ2IscUVBQ0UsSUFBSSxDQUFDLE1BQ1AsTUFBTSxHQUFHLENBQUMsTUFBTSxNQUFNLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUNqRCxDQUFDO1NBQ0g7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzdELFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ3hDLEVBQUUsQ0FDSCxDQUFDO1NBQ0g7UUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsOEJBQThCO0lBQ3ZCLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLE1BQW1CLEVBQ25CLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUNyQixhQUFxQixHQUFHLENBQUMsc0JBQXNCO1FBRS9DLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ25DO1FBQ0Qsd0NBQXdDO1FBQ3hDLElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRTtZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDN0M7UUFFRCxJQUFJLE1BQWMsQ0FBQztRQUVuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1lBQ3JDLEdBQUcsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDcEQ7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQVcsRUFBRSxJQUFZLEVBQUUsVUFBa0I7UUFDbEUsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFFakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQixJQUFJLEdBQUcsR0FBRyxVQUFVLEVBQUU7Z0JBQ3BCLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QztpQkFBTTtnQkFDTCxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hCO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O0FBcEZhLDBCQUFzQixHQUFHLFNBQVMsQ0FBQztBQUNuQyxVQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRVgsZUFBVyxHQUFHLFVBQVUsQ0FBQyJ9