How to use the CRC-16 calculator
- Paste your message into Text. For protocol frames, set Input is to Hex bytes and paste the bytes, for example
01 03 00 00 00 01; spaces are allowed. - Choose the Variant from the list.
- Read the CRC-16 (hex) value, the Decimal value and the Input size. Check whether your protocol sends the high or the low byte first.
What it does and when to use it
A 16-bit CRC is the standard error check on serial links, industrial buses, radio packets and older file-transfer protocols, where 32 bits would waste space. The hard part is rarely the maths; it is knowing which of many CRC-16 definitions a device uses. This tool covers six widely used ones and lists their parameters, so you can find the one that reproduces a captured frame.
For checksums on files and archives, use the CRC-32 calculator. The Adler-32 calculator covers zlib streams, and the simple string hash table shows several other 32-bit hashes at once.
How it works
The code in this page implements the CRC bit by bit from four parameters. Reflected variants process each byte least-significant bit first; the others work most-significant bit first. After the last byte, the register is XORed with the final value.
| Variant (as listed) | Poly | Init | Reflected | Final XOR | Check value |
|---|---|---|---|---|---|
| CRC-16/ARC (IBM, LHA) | 0x8005 | 0x0000 | yes | 0x0000 | bb3d |
| CRC-16/MODBUS | 0x8005 | 0xFFFF | yes | 0x0000 | 4b37 |
| CRC-16/CCITT-FALSE (IBM-3740) | 0x1021 | 0xFFFF | no | 0x0000 | 29b1 |
| CRC-16/XMODEM | 0x1021 | 0x0000 | no | 0x0000 | 31c3 |
| CRC-16/KERMIT | 0x1021 | 0x0000 | yes | 0x0000 | 2189 |
| CRC-16/X-25 (IBM-SDLC) | 0x1021 | 0xFFFF | yes | 0xFFFF | 906e |
The check value is the CRC of the ASCII text 123456789. Each one above was produced by this tool and matches the CRC catalogue.
Worked examples
Default variant. 123456789 with CRC-16/ARC gives CRC-16 (hex): bb3d, decimal 47933.
Same text, CCITT-FALSE. Switching the variant to CRC-16/CCITT-FALSE gives 29b1. Same data, different answer, which is why the variant matters.
A Modbus request. The frame “read one holding register at address 0 from slave 1” is the six bytes 01 03 00 00 00 01. With Hex bytes and CRC-16/MODBUS the tool returns 0a84. Modbus sends the low byte first, so the complete frame on the wire is 01 03 00 00 00 01 84 0A.
Limits and tips
- Only these six variants are built in. If none matches, your device may use another one from the catalogue, such as CRC-16/DNP or CRC-16/USB.
- KERMIT’s value is shown as a number. Some documents print it byte-swapped, as 8921.
- Text input is UTF-8. For binary frames always use Hex bytes.
Frequently asked questions
Which variant does Modbus RTU use?
What do people mean by "CRC-16 CCITT"?
Can a CRC-16 detect every error?
Why are all my results wrong by the same pair of bytes?
Sources
- Catalogue of parametrised CRC algorithms with 16 bits — Greg Cook, CRC RevEng, accessed 2026-10-07
How do we know nothing is uploaded? Test it yourself on the privacy proof page.