Tooleux

CRC-16 Checksum Calculator

CRC (3)

Compute CRC-16 checksums in eight common variants.

Runs in your browser. Nothing leaves your device.
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:

VariantPolyInitReflXorOutUsed by
ARC0x80050x0000yes0x0000Older zip, some Unix tools
CCITT-FALSE0x10210xFFFFno0x0000Many reference implementations
XMODEM0x10210x0000no0x0000XMODEM file transfer
MODBUS0x80050xFFFFyes0x0000Modbus RTU, industrial PLCs
USB0x80050xFFFFyes0xFFFFUSB 1.0/2.0 packets
KERMIT0x10210x0000yes0x0000Kermit file transfer
DNP0x3D650x0000yes0xFFFFDNP3 industrial protocol
MAXIM0x80050x0000yes0xFFFFMaxim 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:

VariantCRC-16 of "123456789"
ARC0xBB3D
CCITT-FALSE0x29B1
XMODEM0x31C3
MODBUS0x4B37
USB0xB4C8

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
Loads a test value into the form
Input
CRC-16