# @taichunmin/crc

> A cross platform alternative for calculating Cyclic Redundancy Checks (CRC) values.

Latest version **0.0.22** (published 2025-07-16) · MIT license · 0 weekly downloads

## Install

```sh
npm install @taichunmin/crc
pnpm add @taichunmin/crc
yarn add @taichunmin/crc
bun add @taichunmin/crc
```

## Health

**Score 50/100 (C)** — status: stable.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: stale.

## Facts

| | |
|---|---|
| Version | 0.0.22 |
| Published | 2025-07-16 |
| First published | 2024-06-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 1 MB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 2 |
| Author | Chunmin Tai |
| Maintainers | taichunmin |
| Keywords | crc8, crc8autosar, crc8bluetooth, crc8cardx, crc8cdma2000, crc8darc, crc8dvbs2, crc8ebu, crc8gsma, crc8gsmb, crc8hitag, crc8icode, crc8itu, crc8legic, crc8mad, crc8maxim, crc8nrsc5, crc8opensafety, crc8rohc, crc8saej1850, crc8wcdma, crc16a, crc16arc, crc16augccitt, crc16buypass, crc16ccittfalse, crc16cdma2000, crc16cms, crc16dds110, crc16dectr, crc16dectx, crc16dnp, crc16en13757, crc16genibus, crc16gsm, crc16iclass, crc16kermit, crc16lj1200, crc16m17, crc16maxim, crc16mcrf4xx, crc16modbus, crc16nrsc5, crc16opensafetya, crc16opensafetyb, crc16philips, crc16profibus, crc16riello, crc16t10dif, crc16teledisk, crc16tms37157, crc16usb, crc16x25, crc16xmodem, crc32, crc32autosar, crc32bzip2, crc32c, crc32cdromedc, crc32d, crc32jamcrc, crc32mef, crc32mpeg2, crc32posix, crc32q, crc32sata, crc32xfer |

## Links

- npm: https://www.npmjs.com/package/@taichunmin/crc
- Repository: https://github.com/taichunmin/js-crc
- Issues: https://github.com/taichunmin/js-crc/issues
- npm.io page: https://npm.io/package/@taichunmin/crc

## Alternatives

- [lodash.startswith](https://npm.io/package/lodash.startswith.md) — 769.7K weekly downloads
- [@tarojs/service](https://npm.io/package/@tarojs/service.md) — 33.9K weekly downloads
- [io.extendreality.tilia.indicators.spatialtargets.unity](https://npm.io/package/io.extendreality.tilia.indicators.spatialtargets.unity.md) — 131 weekly downloads
- [@rtarojs/taro](https://npm.io/package/@rtarojs/taro.md) — 90 weekly downloads
- [node-branch-io](https://npm.io/package/node-branch-io.md) — 50 weekly downloads

## Recent versions

- 0.0.22 (latest) — 2025-07-16
- 0.0.21 — 2025-07-10
- 0.0.20 — 2025-06-03
- 0.0.19 — 2025-06-03
- 0.0.18 — 2025-06-03
- 0.0.17 — 2025-06-03
- 0.0.16 — 2025-06-03
- 0.0.15 — 2025-06-03
- 0.0.14 — 2024-07-24
- 0.0.13 — 2024-07-16
- 0.0.12 — 2024-07-16
- 0.0.11 — 2024-07-15
- 0.0.10 — 2024-07-15
- 0.0.9 — 2024-07-09
- 0.0.8 — 2024-06-27
- … 7 more at https://npm.io/package/@taichunmin/crc/versions

## README

<div align="center">

<h1>@taichunmin/crc</h1>

<p>A cross platform alternative for calculating Cyclic Redundancy Checks (CRC) values.</p>

<p>
<a href="https://taichunmin.idv.tw/pug/crccalc.html"><b>Demo</b></a>
</p>

[![npm version](https://img.shields.io/npm/v/@taichunmin/crc.svg?logo=npm)](https://www.npmjs.org/package/@taichunmin/crc)
[![jsdelivr hits](https://img.shields.io/jsdelivr/npm/hm/@taichunmin/crc?logo=jsdelivr)](https://www.jsdelivr.com/package/npm/@taichunmin/crc)
[![Build status](https://img.shields.io/github/actions/workflow/status/taichunmin/js-crc/ci.yml?branch=master)](https://github.com/taichunmin/js-crc/actions/workflows/ci.yml)
[![Coverage Status](https://img.shields.io/coverallsCoverage/github/taichunmin/js-crc?branch=master)](https://coveralls.io/github/taichunmin/js-crc?branch=master)
[![install size](https://img.shields.io/badge/dynamic/json?url=https://packagephobia.com/v2/api.json?p=@taichunmin%2Fcrc&query=$.install.pretty&label=install%20size)](https://packagephobia.now.sh/result?p=@taichunmin%2Fcrc)
[![npm bundle size](https://img.shields.io/bundlephobia/minzip/@taichunmin/crc)](https://bundlephobia.com/package/@taichunmin/crc@latest)
[![npm downloads](https://img.shields.io/npm/dm/@taichunmin/crc.svg)](https://npm-stat.com/charts.html?package=@taichunmin%2Fcrc)
[![GitHub contributors](https://img.shields.io/github/contributors/taichunmin/js-crc)](https://github.com/taichunmin/js-crc/graphs/contributors)
[![Known vulnerabilities](https://snyk.io/test/npm/@taichunmin/crc/badge.svg)](https://snyk.io/test/npm/@taichunmin/crc)
[![MIT License](https://img.shields.io/github/license/taichunmin/js-crc)](https://github.com/taichunmin/js-crc/blob/master/LICENSE)

</div>

## Features

- Written in TypeScript and provides `d.ts` and `d.mts` files.
- Supports ESM, CommonJS and iife format.
- Pure JavaScript implementation, no dependencies.
- Supported CRC algorithms:
  - crc8
    - crc8: CRC8, CRC8/SMBUS
    - crc8autosar: CRC8/8H2F, CRC8/AUTOSAR
    - crc8bluetooth: CRC8/BLUETOOTH
    - crc8cardx: CRC8/CARDX
    - crc8cdma2000: CRC8/CDMA2000
    - crc8darc: CRC8/DARC
    - crc8dvbs2: CRC8/DVB-S2
    - crc8ebu: CRC8/AES, CRC8/EBU, CRC8/TECH-3250
    - crc8gsma: CRC8/GSM-A
    - crc8gsmb: CRC8/GSM-B
    - crc8hitag: CRC8/HITAG
    - crc8icode: CRC8/I-CODE
    - crc8itu: CRC8/ITU, CRC8/I-432-1
    - crc8legic: CRC8/LEGIC
    - crc8mad: CRC8/MAD, CRC8/MIFARE-MAD
    - crc8maxim: CRC8/DOW-CRC, CRC8/MAXIM, CRC8/MAXIM-DOW
    - crc8nrsc5: CRC8/NRSC-5
    - crc8opensafety: CRC8/OPENSAFETY
    - crc8rohc: CRC8/ROHC
    - crc8saej1850: CRC8/SAE-J1850
    - crc8wcdma: CRC8/WCDMA, CRC8/LTE
  - crc16
    - crc16a: CRC16/A
    - crc16arc: CRC16, CRC16/ARC, CRC16/IBM, CRC16/LHA
    - crc16augccitt: CRC16/AUG-CCITT, CRC16/SPI-FUJITSU
    - crc16buypass: CRC16/BUYPASS, CRC16/UMTS, CRC16/VERIFONE
    - crc16ccittfalse: CRC16/AUTOSAR, CRC16/CCITT-FALSE, CRC16/IBM-3740
    - crc16cdma2000: CRC16/CDMA2000
    - crc16cms: CRC16/CMS
    - crc16dds110: CRC16/DDS-110
    - crc16dectr: CRC16/DECT-R, CRC16/R-CRC-16
    - crc16dectx: CRC16/DECT-X, CRC16/X-CRC-16
    - crc16dnp: CRC16/DNP
    - crc16en13757: CRC16/EN-13757
    - crc16genibus: CRC16/DARC, CRC16/EPC, CRC16/EPC-C1G2, CRC16/GENIBUS, CRC16/I-CODE
    - crc16gsm: CRC16/GSM
    - crc16iclass: CRC16/ICLASS
    - crc16kermit: CRC16/BLUETOOTH, CRC16/CCITT, CRC16/CCITT-TRUE, CRC16/CCITT-TRUE, CRC16/KERMIT, CRC16/V-41-LSB, CRC16/V-41-LSB
    - crc16lj1200: CRC16/LJ1200
    - crc16m17: CRC16/M17
    - crc16maxim: CRC16/MAXIM, CRC16/MAXIM-DOW
    - crc16mcrf4xx: CRC16/MCRF4XX
    - crc16modbus: CRC16/MODBUS
    - crc16nrsc5: CRC16/NRSC-5
    - crc16opensafetya: CRC16/OPENSAFETY-A
    - crc16opensafetyb: CRC16/OPENSAFETY-B
    - crc16philips: CRC16/PHILIPS
    - crc16profibus: CRC16/PROFIBUS
    - crc16riello: CRC16/RIELLO
    - crc16t10dif: CRC16/T10_DIF
    - crc16teledisk: CRC16/TELEDISK
    - crc16tms37157: CRC16/TMS37157
    - crc16usb: CRC16/USB
    - crc16x25: CRC16/B, CRC16/IBM-SDLC, CRC16/ISO-HDLC, CRC16/ISO-IEC-14443-3-B, CRC16/X-25
    - crc16xmodem: CRC16/ACORN, CRC16/LTE, CRC16/V-41-MSB, CRC16/XMODEM, CRC16/ZMODEM
  - crc32
    - crc32: CRC32, CRC32/ADCCP, CRC32/PKZIP, CRC32/V-42, CRC32/XZ
    - crc32autosar: CRC32/AUTOSAR
    - crc32bzip2: CRC32/AAL5, CRC32/BZIP2, CRC32/DECT-B
    - crc32c: CRC32/BASE91-C, CRC32/C, CRC32/CASTAGNOLI, CRC32/INTERLAKEN
    - crc32cdromedc: CRC32/CD-ROM-EDC
    - crc32d: CRC32/D, CRC32/BASE91-D
    - crc32jamcrc: CRC32/JAMCRC
    - crc32mef: CRC32/MEF
    - crc32mpeg2: CRC32/MPEG2
    - crc32posix: CRC32/CKSUM, CRC32/POSIX
    - crc32q: CRC32/AIXM, CRC32/Q
    - crc32sata: CRC32/SATA
    - crc32xfer: CRC32/XFER

## Installation

### Package manager

Using npm or yarn to install the package:

```bash
# npm
npm install @taichunmin/crc

# yarn
yarn add @taichunmin/crc
```

Once the package is installed, you can import the library using import or require:

```js
// import
import crc8 from '@taichunmin/crc/crc8'
import crc16a from '@taichunmin/crc/crc16a'
import crc32 from '@taichunmin/crc/crc32'

// require
const crc8 = require('@taichunmin/crc/crc8')
const crc16a = require('@taichunmin/crc/crc16a')
const crc32 = require('@taichunmin/crc/crc32')
```

### CDN

Using jsDelivr CDN:

```html
<!-- script -->
<script src="https://cdn.jsdelivr.net/npm/@taichunmin/crc@0"></script>
<script>
  const { crc16a, crc32 } = window?.taichunmin?.crc
</script>

<!-- module -->
<script type="module">
  import crc8 from 'https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc8/+esm'
  import crc16a from 'https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc16a/+esm'
  import crc32 from 'https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc32/+esm'
</script>

<!-- module + async import (can be used in DevTools) -->
<script type="module">
  const { default: crc8 } = await import('https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc8/+esm')
  const { default: crc16a } = await import('https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc16a/+esm')
  const { default: crc32 } = await import('https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc32/+esm')
</script>
```

## Usage

### Node.js

Using specific CRC is the recommended way to reduce bundle size:

```js
import crc32 from '@taichunmin/crc/crc32'
console.log(crc32(new Uint8Array([0x68, 0x65, 0x6C, 0x6C, 0x6F])).toString(16))
// "3610a686"
```

Using `TextEncoder` to encode UTF-8 string to `Uint8Array`:

```js
import crc32 from '@taichunmin/crc/crc32'
crc32(new TextEncoder('utf-8').encode('hello')).toString(16)
// "3610a686"
```

Or using a `Buffer`:

```js
import crc32 from '@taichunmin/crc/crc32'
crc32(Buffer.from('hello')).toString(16)
// "3610a686"
crc32(Buffer.from('68656C6C6F', 'hex')).toString(16)
// "3610a686"
crc32(fs.readFileSync('README.md', 'utf-8')).toString(16)
```

Incrementally calculate a CRC:

```js
import crc32 from '@taichunmin/crc/crc32'

const utf8Encoder = new TextEncoder('utf-8')
let value = crc32()
for (const chunk of ['one', 'two', 'three']) value = crc32(utf8Encoder.encode(chunk), value)
value.toString(16)
// "9e1c092"
```

### Browser

```html
<!-- script -->
<script src="https://cdn.jsdelivr.net/npm/@taichunmin/crc@0"></script>
<script>
  const { crc32 } = window?.taichunmin?.crc
  console.log(crc32(new Uint8Array([0x68, 0x65, 0x6C, 0x6C, 0x6F])).toString(16))
  // "3610a686"
</script>

<!-- module -->
<script type="module">
  import crc32 from 'https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc32/+esm'
  console.log(crc32(new Uint8Array([0x68, 0x65, 0x6C, 0x6C, 0x6F])).toString(16))
  // "3610a686"
</script>

<!-- module + import (can be used in DevTools) -->
<script type="module">
  const { default: crc32 } = await import('https://cdn.jsdelivr.net/npm/@taichunmin/crc@0/crc32/+esm')
  console.log(crc32(new Uint8Array([0x68, 0x65, 0x6C, 0x6C, 0x6F])).toString(16))
  // "3610a686"
</script>
```

## References

- <https://crccalc.com/>
- <http://www.sunshine2k.de/coding/javascript/crc/crc_js.html> [(Backup)](https://gist.github.com/taichunmin/92fa001f139e5a73f5127d9389123d78)
- <https://reveng.sourceforge.io/crc-catalogue/>
- <https://pypi.org/project/crccheck/>
- <https://github.com/Fabio286/easy-crc>
- <https://github.com/mrhooray/crc-rs>
- <https://github.com/alexgorbatchev/crc>
- <https://github.com/overcat/fastcrc>
- <https://github.com/taichunmin/proxmark3.js/blob/master/src/crc16.js>
- <https://github.com/ratriches/crc/blob/main/src/crcCalc.js>
- <https://blog.csdn.net/lianyunyouyou/article/details/107217125>

---
_Source: https://npm.io/package/@taichunmin/crc · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
