@iotize/tap
Version:
IoTize Device client for Javascript
64 lines • 5.6 kB
JavaScript
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