mh-two-thousand-and-two
2024-04-12 7fc6dbf547b8899d949b67cdec36b96a7d1701c7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
'use strict';
 
var crc_table = [];
 
for (var n = 0; n < 256; n++) {
    var c = crc_table[n] = new Buffer(4);
    c.writeUInt32BE(n, 0);
 
    for (var k = 0; k < 8; k++) {
        var b0 = c[0] & 1;
        var b1 = c[1] & 1;
        var b2 = c[2] & 1;
        var b3 = c[3] & 1;
 
        c[0] = (c[0] >> 1) ^ (b3 ? 0xed : 0);
        c[1] = (c[1] >> 1) ^ (b3 ? 0xb8 : 0) ^ (b0 ? 0x80 : 0);
        c[2] = (c[2] >> 1) ^ (b3 ? 0x83 : 0) ^ (b1 ? 0x80 : 0);
        c[3] = (c[3] >> 1) ^ (b3 ? 0x20 : 0) ^ (b2 ? 0x80 : 0);
    }
}
 
function update(c, buf) {
    var l = buf.length;
    for (var n = 0; n < l; n++) {
        var e = crc_table[c[3] ^ buf[n]];
        c[3] = e[3] ^ c[2];
        c[2] = e[2] ^ c[1];
        c[1] = e[1] ^ c[0];
        c[0] = e[0];
    }
}
 
function crc32(/* arguments */) {
    var l = arguments.length;
    var c = new Buffer(4);
    c.fill(0xff);
 
    for (var i = 0; i < l; i++) {
        update(c, new Buffer(arguments[i]));
    }
 
    c[0] = c[0] ^ 0xff;
    c[1] = c[1] ^ 0xff;
    c[2] = c[2] ^ 0xff;
    c[3] = c[3] ^ 0xff;
 
    return c.readUInt32BE(0);
}
 
module.exports = crc32;