You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
3.6 KiB

2 years ago
var isStr = require('./isStr');
var strToBytes = require('./strToBytes');
var TABLE = [
0x0000,
0xc0c1,
0xc181,
0x0140,
0xc301,
0x03c0,
0x0280,
0xc241,
0xc601,
0x06c0,
0x0780,
0xc741,
0x0500,
0xc5c1,
0xc481,
0x0440,
0xcc01,
0x0cc0,
0x0d80,
0xcd41,
0x0f00,
0xcfc1,
0xce81,
0x0e40,
0x0a00,
0xcac1,
0xcb81,
0x0b40,
0xc901,
0x09c0,
0x0880,
0xc841,
0xd801,
0x18c0,
0x1980,
0xd941,
0x1b00,
0xdbc1,
0xda81,
0x1a40,
0x1e00,
0xdec1,
0xdf81,
0x1f40,
0xdd01,
0x1dc0,
0x1c80,
0xdc41,
0x1400,
0xd4c1,
0xd581,
0x1540,
0xd701,
0x17c0,
0x1680,
0xd641,
0xd201,
0x12c0,
0x1380,
0xd341,
0x1100,
0xd1c1,
0xd081,
0x1040,
0xf001,
0x30c0,
0x3180,
0xf141,
0x3300,
0xf3c1,
0xf281,
0x3240,
0x3600,
0xf6c1,
0xf781,
0x3740,
0xf501,
0x35c0,
0x3480,
0xf441,
0x3c00,
0xfcc1,
0xfd81,
0x3d40,
0xff01,
0x3fc0,
0x3e80,
0xfe41,
0xfa01,
0x3ac0,
0x3b80,
0xfb41,
0x3900,
0xf9c1,
0xf881,
0x3840,
0x2800,
0xe8c1,
0xe981,
0x2940,
0xeb01,
0x2bc0,
0x2a80,
0xea41,
0xee01,
0x2ec0,
0x2f80,
0xef41,
0x2d00,
0xedc1,
0xec81,
0x2c40,
0xe401,
0x24c0,
0x2580,
0xe541,
0x2700,
0xe7c1,
0xe681,
0x2640,
0x2200,
0xe2c1,
0xe381,
0x2340,
0xe101,
0x21c0,
0x2080,
0xe041,
0xa001,
0x60c0,
0x6180,
0xa141,
0x6300,
0xa3c1,
0xa281,
0x6240,
0x6600,
0xa6c1,
0xa781,
0x6740,
0xa501,
0x65c0,
0x6480,
0xa441,
0x6c00,
0xacc1,
0xad81,
0x6d40,
0xaf01,
0x6fc0,
0x6e80,
0xae41,
0xaa01,
0x6ac0,
0x6b80,
0xab41,
0x6900,
0xa9c1,
0xa881,
0x6840,
0x7800,
0xb8c1,
0xb981,
0x7940,
0xbb01,
0x7bc0,
0x7a80,
0xba41,
0xbe01,
0x7ec0,
0x7f80,
0xbf41,
0x7d00,
0xbdc1,
0xbc81,
0x7c40,
0xb401,
0x74c0,
0x7580,
0xb541,
0x7700,
0xb7c1,
0xb681,
0x7640,
0x7200,
0xb2c1,
0xb381,
0x7340,
0xb101,
0x71c0,
0x7080,
0xb041,
0x5000,
0x90c1,
0x9181,
0x5140,
0x9301,
0x53c0,
0x5280,
0x9241,
0x9601,
0x56c0,
0x5780,
0x9741,
0x5500,
0x95c1,
0x9481,
0x5440,
0x9c01,
0x5cc0,
0x5d80,
0x9d41,
0x5f00,
0x9fc1,
0x9e81,
0x5e40,
0x5a00,
0x9ac1,
0x9b81,
0x5b40,
0x9901,
0x59c0,
0x5880,
0x9841,
0x8801,
0x48c0,
0x4980,
0x8941,
0x4b00,
0x8bc1,
0x8a81,
0x4a40,
0x4e00,
0x8ec1,
0x8f81,
0x4f40,
0x8d01,
0x4dc0,
0x4c80,
0x8c41,
0x4400,
0x84c1,
0x8581,
0x4540,
0x8701,
0x47c0,
0x4680,
0x8641,
0x8201,
0x42c0,
0x4380,
0x8341,
0x4100,
0x81c1,
0x8081,
0x4040
];
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);
exports = function(input, previous) {
return exports.signed(input, previous) >>> 0;
};
exports.signed = function(input, previous) {
if (isStr(input)) input = strToBytes(input);
var crc = ~~previous;
for (var i = 0, len = input.length; i < len; i++) {
var byte = input[i];
crc = (TABLE[(crc ^ byte) & 0xff] ^ (crc >> 8)) & 0xffff;
}
return crc;
};
module.exports = exports;