|
@@ -0,0 +1,60 @@
|
|
|
+var poly = 0xEDB88320; // reverse polynomial
|
|
|
+
|
|
|
+// build table
|
|
|
+function signed_crc_table() {
|
|
|
+ var c, n, k, table = new Array(256)
|
|
|
+
|
|
|
+ for (n = 0; n < 256; n++) {
|
|
|
+ c = n
|
|
|
+ for (k = 0; k < 8; k++) {
|
|
|
+ if (c & 1) {
|
|
|
+ c = poly ^ (c >>> 1)
|
|
|
+ } else {
|
|
|
+ c = c >>> 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ table[n] = c >>> 0
|
|
|
+ }
|
|
|
+
|
|
|
+ return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table
|
|
|
+}
|
|
|
+
|
|
|
+var T = signed_crc_table()
|
|
|
+
|
|
|
+function crc32_str(str: string, seed: number = 0) {
|
|
|
+ var C = seed ^ -1;
|
|
|
+ for (var i = 0, L = str.length, c, d; i < L;) {
|
|
|
+ c = str.charCodeAt(i++);
|
|
|
+ if (c < 0x80) {
|
|
|
+ C = (C >>> 8) ^ T[(C ^ c) & 0xFF];
|
|
|
+ } else if (c < 0x800) {
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (192 | ((c >> 6) & 31))) & 0xFF];
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (128 | (c & 63))) & 0xFF];
|
|
|
+ } else if (c >= 0xD800 && c < 0xE000) {
|
|
|
+ c = (c & 1023) + 64;
|
|
|
+ d = str.charCodeAt(i++) & 1023;
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (240 | ((c >> 8) & 7))) & 0xFF];
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (128 | ((c >> 2) & 63))) & 0xFF];
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (128 | ((d >> 6) & 15) | ((c & 3) << 4))) & 0xFF];
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (128 | (d & 63))) & 0xFF];
|
|
|
+ } else {
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (224 | ((c >> 12) & 15))) & 0xFF];
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (128 | ((c >> 6) & 63))) & 0xFF];
|
|
|
+ C = (C >>> 8) ^ T[(C ^ (128 | (c & 63))) & 0xFF];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return C ^ -1;
|
|
|
+}
|
|
|
+
|
|
|
+function decimalToHex(num: number) {
|
|
|
+ var str = (num >>> 0).toString(16)
|
|
|
+ var padLen = 8 - str.length
|
|
|
+
|
|
|
+ return padLen > 0 ? new Array(padLen + 1).join('0') + str : str
|
|
|
+}
|
|
|
+
|
|
|
+function crc32(str: string) {
|
|
|
+ return decimalToHex(crc32_str(str))
|
|
|
+}
|
|
|
+
|
|
|
+export default crc32
|