CRC-16 Checksum Calculator
Compute CRC-16 checksums in eight common variants.
Calculate CRC-16 checksums of text or bytes. Supports ARC, CCITT-FALSE, XMODEM, MODBUS, USB, KERMIT, DNP, and MAXIM variants. Free, offline, runs in your browser. Read more Show less
What is CRC-16?
CRC-16 is a family of 16-bit cyclic redundancy check algorithms used for detecting accidental errors in digital data. It is the checksum used in Modbus, USB, XMODEM, HDLC, Bluetooth, and dozens of embedded and industrial protocols.
CRC-16 is not a cryptographic hash. It is not designed to resist intentional modification. It is designed to detect the kinds of errors that happen on real wires: single-bit flips, short bursts, and dropped bytes.
The variants
There is no single "CRC-16". Different applications use different polynomials, initial values, and reflection settings. This tool supports the eight most common variants:
| Variant | Poly | Init | Refl | XorOut | Used by |
|---|---|---|---|---|---|
| ARC | 0x8005 | 0x0000 | yes | 0x0000 | Older zip, some Unix tools |
| CCITT-FALSE | 0x1021 | 0xFFFF | no | 0x0000 | Many reference implementations |
| XMODEM | 0x1021 | 0x0000 | no | 0x0000 | XMODEM file transfer |
| MODBUS | 0x8005 | 0xFFFF | yes | 0x0000 | Modbus RTU, industrial PLCs |
| USB | 0x8005 | 0xFFFF | yes | 0xFFFF | USB 1.0/2.0 packets |
| KERMIT | 0x1021 | 0x0000 | yes | 0x0000 | Kermit file transfer |
| DNP | 0x3D65 | 0x0000 | yes | 0xFFFF | DNP3 industrial protocol |
| MAXIM | 0x8005 | 0x0000 | yes | 0xFFFF | Maxim 1-Wire devices |
Poly is the polynomial. Init is the starting value of the register. Refl means input and output are reflected (bit order is reversed). XorOut is XORed with the final value.
How to compute
Type or paste your input, choose the variant, and choose output format. The tool hashes the raw bytes - choose UTF-8 for text, or hex/Base64 for binary data.
For example, 123456789 (the standard CRC test vector) produces:
| Variant | CRC-16 of "123456789" |
|---|---|
| ARC | 0xBB3D |
| CCITT-FALSE | 0x29B1 |
| XMODEM | 0x31C3 |
| MODBUS | 0x4B37 |
| USB | 0xB4C8 |
FAQ
Which variant should I use?
Whichever your protocol documentation specifies. If you are implementing Modbus, use MODBUS. If you are parsing USB packets, use USB. If you are implementing XMODEM, use XMODEM. If you just need "a 16-bit checksum" for internal use, CCITT-FALSE is the most common default.
Why do different tools give different CRCs for the same input?
Because they are using different variants. Check the polynomial, initial value, and reflection settings. The polynomial alone is not enough to identify a variant - 0x8005 can mean ARC, MODBUS, USB, or MAXIM depending on the other parameters.
CRC-16 vs CRC-32
CRC-32 is twice as wide and detects a wider range of errors, but costs slightly more. CRC-16 is common in embedded and industrial contexts because 16 bits is often enough for short packets and fits in a 16-bit register. See the CRC-32 tool for the wider version.
Is CRC-16 secure?
No. CRC is designed to detect accidental errors, not intentional tampering. Anyone can construct two different messages with the same CRC-16 by hand. For integrity against an attacker, use HMAC or a real digital signature.
What does "reflected" mean?
Reflected CRC processes each byte starting from the least significant bit, and outputs the final register with its bits reversed. Some hardware implementations are naturally reflected and some are not, and the standards followed suit. There is no cryptographic difference; it is purely a matter of convention.
Why is CRC-16 called a "check" and not a "hash"?
Historically, cryptographic hashes are designed to resist deliberate attacks; checksums are designed to detect accidental errors. Both map input to a fixed-length output, but the security properties and the terminology differ.
Command line equivalent
# Python (binascii and crcmod)
python3 -c 'import binascii; print(hex(binascii.crc_hqx(b"123456789", 0x0000)))' # XMODEM
# crcmod library - supports all variants
pip install crcmod
python3 -c '
import crcmod.predefined
for name in ["crc-16", "crc-16-modbus", "xmodem", "kermit"]:
fn = crcmod.predefined.mkCrcFun(name)
print(name, hex(fn(b"123456789")))
'
# Node with crc
npm i crc
node -e '
const crc = require("crc");
console.log(crc.crc16modbus(Buffer.from("123456789")).toString(16));
console.log(crc.crc16xmodem(Buffer.from("123456789")).toString(16));
'
# Command line (Linux)
echo -n "123456789" | cksum -a crc16