|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- # crc32
-
- Standard CRC-32 algorithm implementation in JS (for the browser and nodejs).
- Emphasis on correctness, performance, and IE6+ support.
-
- ## Installation
-
- With [npm](https://www.npmjs.org/package/crc-32):
-
- ```bash
- $ npm install crc-32
- ```
-
- When installed globally, npm installs a script `crc32` that computes the
- checksum for a specified file or standard input.
-
- <details>
- <summary><b>CDN Availability</b> (click to show)</summary>
-
- | CDN | URL |
- |-----------:|:-------------------------------------------|
- | `unpkg` | <https://unpkg.com/crc-32/> |
- | `jsDelivr` | <https://jsdelivr.com/package/npm/crc-32> |
- | `CDNjs` | <https://cdnjs.com/libraries/crc-32> |
-
- </details>
-
-
- ## Integration
-
- Using NodeJS or a bundler:
-
- ```js
- var CRC32 = require("crc-32");
- ```
-
- In the browser, the `crc32.js` script can be loaded directly:
-
- ```html
- <script src="crc32.js"></script>
- ```
-
- The browser script exposes a variable `CRC32`.
-
- The script will manipulate `module.exports` if available . This is not always
- desirable. To prevent the behavior, define `DO_NOT_EXPORT_CRC`.
-
- ### CRC32C (Castagnoli)
-
- The module and CDNs also include a parallel script for CRC32C calculations.
-
- Using NodeJS or a bundler:
-
- ```js
- var CRC32C = require("crc-32/crc32c");
- ```
-
- In the browser, the `crc32c.js` script can be loaded directly:
-
- ```html
- <script src="crc32c.js"></script>
- ```
-
- The browser exposes a variable `CRC32C`.
-
- The script will manipulate `module.exports` if available . This is not always
- desirable. To prevent the behavior, define `DO_NOT_EXPORT_CRC`.
-
- ## Usage
-
- In all cases, the relevant function takes an argument representing data and an
- optional second argument representing the starting "seed" (for rolling CRC).
-
- The return value is a signed 32-bit integer.
-
- - `CRC32.buf(byte array or buffer[, seed])` assumes the argument is a sequence
- of 8-bit unsigned integers (nodejs `Buffer`, `Uint8Array` or array of bytes).
-
- - `CRC32.bstr(binary string[, seed])` assumes the argument is a binary string
- where byte `i` is the low byte of the UCS-2 char: `str.charCodeAt(i) & 0xFF`
-
- - `CRC32.str(string[, seed])` assumes the argument is a standard JS string and
- calculates the hash of the UTF-8 encoding.
-
- For example:
-
- ```js
- // var CRC32 = require('crc-32'); // uncomment this line if in node
- CRC32.str("SheetJS") // -1647298270
- CRC32.bstr("SheetJS") // -1647298270
- CRC32.buf([ 83, 104, 101, 101, 116, 74, 83 ]) // -1647298270
-
- crc32 = CRC32.buf([83, 104]) // -1826163454 "Sh"
- crc32 = CRC32.str("eet", crc32) // 1191034598 "Sheet"
- CRC32.bstr("JS", crc32) // -1647298270 "SheetJS"
-
- [CRC32.str("\u2603"), CRC32.str("\u0003")] // [ -1743909036, 1259060791 ]
- [CRC32.bstr("\u2603"), CRC32.bstr("\u0003")] // [ 1259060791, 1259060791 ]
- [CRC32.buf([0x2603]), CRC32.buf([0x0003])] // [ 1259060791, 1259060791 ]
-
- // var CRC32C = require('crc-32/crc32c'); // uncomment this line if in node
- CRC32C.str("SheetJS") // -284764294
- CRC32C.bstr("SheetJS") // -284764294
- CRC32C.buf([ 83, 104, 101, 101, 116, 74, 83 ]) // -284764294
-
- crc32c = CRC32C.buf([83, 104]) // -297065629 "Sh"
- crc32c = CRC32C.str("eet", crc32c) // 1241364256 "Sheet"
- CRC32C.bstr("JS", crc32c) // -284764294 "SheetJS"
-
- [CRC32C.str("\u2603"), CRC32C.str("\u0003")] // [ 1253703093, 1093509285 ]
- [CRC32C.bstr("\u2603"), CRC32C.bstr("\u0003")] // [ 1093509285, 1093509285 ]
- [CRC32C.buf([0x2603]), CRC32C.buf([0x0003])] // [ 1093509285, 1093509285 ]
- ```
-
- ### Best Practices
-
- Even though the initial seed is optional, for performance reasons it is highly
- recommended to explicitly pass the default seed 0.
-
- In NodeJS with the native Buffer implementation, it is oftentimes faster to
- convert binary strings with `Buffer.from(bstr, "binary")` first:
-
- ```js
- /* Frequently slower in NodeJS */
- crc32 = CRC32.bstr(bstr, 0);
- /* Frequently faster in NodeJS */
- crc32 = CRC32.buf(Buffer.from(bstr, "binary"), 0);
- ```
-
- This does not apply to browser `Buffer` shims, and thus is not implemented in
- the library directly.
-
- ## Testing
-
- `make test` will run the nodejs-based test.
-
- To run the in-browser tests, run a local server and go to the `ctest` directory.
- `make ctestserv` will start a python `SimpleHTTPServer` server on port 8000.
-
- To update the browser artifacts, run `make ctest`.
-
- To generate the bits file, use the `crc32` function from python `zlib`:
-
- ```python
- >>> from zlib import crc32
- >>> x="foo bar baz٪☃🍣"
- >>> crc32(x)
- 1531648243
- >>> crc32(x+x)
- -218791105
- >>> crc32(x+x+x)
- 1834240887
- ```
-
- The included `crc32.njs` script can process files or standard input:
-
- ```bash
- $ echo "this is a test" > t.txt
- $ bin/crc32.njs t.txt
- 1912935186
- ```
-
- For comparison, the included `crc32.py` script uses python `zlib`:
-
- ```bash
- $ bin/crc32.py t.txt
- 1912935186
- ```
-
- On OSX the command `cksum` generates unsigned CRC-32 with Algorithm 3:
-
- ```bash
- $ cksum -o 3 < IE8.Win7.For.Windows.VMware.zip
- 1891069052 4161613172
- $ crc32 --unsigned ~/Downloads/IE8.Win7.For.Windows.VMware.zip
- 1891069052
- ```
-
- ## Performance
-
- `make perf` will run algorithmic performance tests (which should justify certain
- decisions in the code).
-
- The [`adler-32` project](http://git.io/adler32) has more performance notes
-
- ## License
-
- Please consult the attached LICENSE file for details. All rights not explicitly
- granted by the Apache 2.0 license are reserved by the Original Author.
-
- ## Badges
-
- [](https://saucelabs.com/u/crc32)
-
- [](https://travis-ci.org/SheetJS/js-crc32)
- [](https://coveralls.io/r/SheetJS/js-crc32?branch=master)
- [](https://david-dm.org/sheetjs/js-crc32)
- [](https://npmjs.org/package/crc-32)
- [](https://ghit.me/repo/sheetjs/js-xlsx)
- [](https://github.com/SheetJS/js-crc32)
|