f60b1effae494cea15e34debc6b7ba164100d1d6.svn-base
2.05 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(function () {
'use strict';
var table = [],
poly = 0xEDB88320; // reverse polynomial
// build the table
function makeTable() {
var c, n, k;
for (n = 0; n < 256; n += 1) {
c = n;
for (k = 0; k < 8; k += 1) {
if (c & 1) {
c = poly ^ (c >>> 1);
} else {
c = c >>> 1;
}
}
table[n] = c >>> 0;
}
}
function strToArr(str) {
// sweet hack to turn string into a 'byte' array
return Array.prototype.map.call(str, function (c) {
return c.charCodeAt(0);
});
}
/*
* Compute CRC of array directly.
*
* This is slower for repeated calls, so append mode is not supported.
*/
function crcDirect(arr) {
var crc = -1, // initial contents of LFBSR
i, j, l, temp;
for (i = 0, l = arr.length; i < l; i += 1) {
temp = (crc ^ arr[i]) & 0xff;
// read 8 bits one at a time
for (j = 0; j < 8; j += 1) {
if ((temp & 1) === 1) {
temp = (temp >>> 1) ^ poly;
} else {
temp = (temp >>> 1);
}
}
crc = (crc >>> 8) ^ temp;
}
// flip bits
return crc ^ -1;
}
/*
* Compute CRC with the help of a pre-calculated table.
*
* This supports append mode, if the second parameter is set.
*/
function crcTable(arr, append) {
var crc, i, l;
// if we're in append mode, don't reset crc
// if arr is null or undefined, reset table and return
if (typeof crcTable.crc === 'undefined' || !append || !arr) {
crcTable.crc = 0 ^ -1;
if (!arr) {
return;
}
}
// store in temp variable for minor speed gain
crc = crcTable.crc;
for (i = 0, l = arr.length; i < l; i += 1) {
crc = (crc >>> 8) ^ table[(crc ^ arr[i]) & 0xff];
}
crcTable.crc = crc;
return crc ^ -1;
}
// build the table
// this isn't that costly, and most uses will be for table assisted mode
makeTable();
module.exports = function (val, direct) {
var val = (typeof val === 'string') ? strToArr(val) : val,
ret = direct ? crcDirect(val) : crcTable(val);
// convert to 2's complement hex
return (ret >>> 0).toString(16);
};
module.exports.direct = crcDirect;
module.exports.table = crcTable;
}());