CRC16 Calculator
Calculate a 16-bit CRC for text, hex bytes or a file. The table below the calculator shows all 31 CRC-16 variants for your input at once, so you can find the one that matches your protocol or device.
ResultCRC-16/CCITT-FALSE
- Decimal
- 10673
- Binary
- 0010100110110001
- Bytes, big-endian
- 29 B1
- Bytes, little-endian
- B1 29
Check value for "123456789": 0x29B1
Source code for this CRC
Generated for the parameters above. Bit-by-bit and table-free, so it is easy to port to a microcontroller.
#include <stddef.h>
#include <stdint.h>
uint16_t crc_16_ccitt_false(const uint8_t *data, size_t len)
{
uint16_t crc = 0xFFFF;
while (len--) {
crc ^= (uint16_t)*data++ << 8;
for (int i = 0; i < 8; i++)
crc = (crc & 0x8000) ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc;
}
All CRC algorithms for this input
Click a row to load its parameters into the calculator.
| Algorithm | Result | Poly | Init | RefIn | RefOut | XorOut | Check | Used in |
|---|---|---|---|---|---|---|---|---|
| 0xBB3D | 0x8005 | 0x0000 | true | true | 0x0000 | 0xBB3D | ARC, LHA, legacy disk formats | |
| 0x4B37 | 0x8005 | 0xFFFF | true | true | 0x0000 | 0x4B37 | Modbus RTU frames | |
| 0xB4C8 | 0x8005 | 0xFFFF | true | true | 0xFFFF | 0xB4C8 | USB data packets | |
| 0x44C2 | 0x8005 | 0x0000 | true | true | 0xFFFF | 0x44C2 | Maxim 1-Wire / iButton | |
| 0x29B1 | 0x1021 | 0xFFFF | false | false | 0x0000 | 0x29B1 | Most "CCITT" implementations, AUTOSAR | |
| 0x31C3 | 0x1021 | 0x0000 | false | false | 0x0000 | 0x31C3 | XMODEM, ZMODEM, SD card data | |
| 0x2189 | 0x1021 | 0x0000 | true | true | 0x0000 | 0x2189 | Kermit, Bluetooth, V.41 | |
| 0x906E | 0x1021 | 0xFFFF | true | true | 0xFFFF | 0x906E | X.25, HDLC, PPP, ISO 14443-B | |
| 0x6F91 | 0x1021 | 0xFFFF | true | true | 0x0000 | 0x6F91 | Microchip MCRF4xx, MAVLink | |
| 0xD64E | 0x1021 | 0xFFFF | false | false | 0xFFFF | 0xD64E | Grundfos GENIbus, EPC RFID | |
| 0xE5CC | 0x1021 | 0x1D0F | false | false | 0x0000 | 0xE5CC | Fujitsu SPI flash | |
| 0xCE3C | 0x1021 | 0x0000 | false | false | 0xFFFF | 0xCE3C | GSM | |
| 0x26B1 | 0x1021 | 0x89EC | true | true | 0x0000 | 0x26B1 | TI TMS37157 transponders | |
| 0x63D0 | 0x1021 | 0xB2AA | true | true | 0x0000 | 0x63D0 | Riello UPS protocol | |
| 0xBF05 | 0x1021 | 0xC6C6 | true | true | 0x0000 | 0xBF05 | ISO 14443-A (MIFARE, NFC-A) | |
| 0xEA82 | 0x3D65 | 0x0000 | true | true | 0xFFFF | 0xEA82 | DNP3 (SCADA) | |
| 0xC2B7 | 0x3D65 | 0x0000 | false | false | 0xFFFF | 0xC2B7 | Wireless M-Bus metering | |
| 0xFEE8 | 0x8005 | 0x0000 | false | false | 0x0000 | 0xFEE8 | Verifone, UMTS | |
| 0xAEE7 | 0x8005 | 0xFFFF | false | false | 0x0000 | 0xAEE7 | RPM package format | |
| 0x9ECF | 0x8005 | 0x800D | false | false | 0x0000 | 0x9ECF | ELV DDS-110 function generator | |
| 0x007E | 0x0589 | 0x0000 | false | false | 0x0001 | 0x007E | DECT cordless | |
| 0x007F | 0x0589 | 0x0000 | false | false | 0x0000 | 0x007F | DECT cordless | |
| 0xD0DB | 0x8BB7 | 0x0000 | false | false | 0x0000 | 0xD0DB | SCSI data integrity field | |
| 0x0FB3 | 0xA097 | 0x0000 | false | false | 0x0000 | 0x0FB3 | Teledisk disk images | |
| 0x4C06 | 0xC867 | 0xFFFF | false | false | 0x0000 | 0x4C06 | CDMA2000 mobile | |
| 0xA819 | 0x1DCF | 0xFFFF | false | false | 0xFFFF | 0xA819 | PROFIBUS PA | |
| 0x5D38 | 0x5935 | 0x0000 | false | false | 0x0000 | 0x5D38 | openSAFETY | |
| 0x20FE | 0x755B | 0x0000 | false | false | 0x0000 | 0x20FE | openSAFETY | |
| 0xBDF4 | 0x6F63 | 0x0000 | false | false | 0x0000 | 0xBDF4 | LoJack vehicle tracking | |
| 0xA066 | 0x080B | 0xFFFF | true | true | 0x0000 | 0xA066 | HD Radio | |
| 0x772B | 0x5935 | 0xFFFF | false | false | 0x0000 | 0x772B | M17 digital radio |
The CRC16 variants you are most likely to meet
"CRC16" names a family, not one algorithm. Most variants are built on one of two polynomials — 0x1021 (CCITT) or 0x8005 (IBM / ANSI) — and differ only in the initial value, bit reflection and final XOR.
| Variant | Poly | Init | Reflected | XorOut | Check |
|---|---|---|---|---|---|
| CRC-16/CCITT-FALSE | 1021 | FFFF | no | 0000 | 29B1 |
| CRC-16/XMODEM | 1021 | 0000 | no | 0000 | 31C3 |
| CRC-16/KERMIT (CCITT) | 1021 | 0000 | yes | 0000 | 2189 |
| CRC-16/X-25 | 1021 | FFFF | yes | FFFF | 906E |
| CRC-16/ARC (IBM) | 8005 | 0000 | yes | 0000 | BB3D |
| CRC-16/MODBUS | 8005 | FFFF | yes | 0000 | 4B37 |
| CRC-16/USB | 8005 | FFFF | yes | FFFF | B4C8 |
The check value is the CRC of the nine ASCII characters 123456789. It is the quickest way to confirm that a piece of code implements the variant its name claims.
How to identify an unknown CRC16
- Capture one complete message together with its two CRC bytes.
- Paste the message without the CRC bytes into the calculator in Hex mode.
- Scan the result column of the table for the captured CRC. Check both byte orders —
4B 37on the wire may be the value0x374Bor0x4B37. - If nothing matches, the CRC may cover a different range than you assumed. Try with and without the header, address or length bytes.
Where each variant is used
- CRC-16/MODBUS — Modbus RTU on RS-485 and RS-232. There is a dedicated Modbus CRC calculator that builds and verifies whole frames.
- CRC-16/CCITT-FALSE — the variant most libraries and datasheets mean by "CRC-CCITT"; also the AUTOSAR 16-bit CRC.
- CRC-16/XMODEM — XMODEM and ZMODEM file transfer, SD card data blocks, many bootloaders.
- CRC-16/KERMIT — Kermit, Bluetooth, and other protocols following ITU-T V.41 exactly.
- CRC-16/X-25 — HDLC, PPP, X.25 and ISO 14443 type B contactless cards.
- CRC-16/ARC — the original IBM CRC-16: ARC and LHA archives and many older file formats.
- CRC-16/DNP and CRC-16/EN-13757 — DNP3 in utilities and wireless M-Bus in metering.
Need a wider checksum? The CRC32 calculator covers CRC-32, CRC-32C and CRC-64 with the same interface.
Related CRC tools
- CRC8 calculator — for single-byte checks on sensors, SMBus and 1-Wire.
- CRC64 calculator — when even 32 bits is not enough.
- Checksum calculator — if the two check bytes turn out to be a plain sum, XOR or Fletcher-16 rather than a CRC.
- How a CRC is calculated — the polynomial division behind every variant on this page.
Frequently asked questions
Which CRC16 is the "standard" one?
There is no single standard. "CRC-16" on its own usually means CRC-16/ARC (polynomial 0x8005, reflected, initial value 0), while "CRC-16 CCITT" usually means CRC-16/CCITT-FALSE (polynomial 0x1021, initial value 0xFFFF, not reflected). Always confirm with a known test vector: for "123456789", ARC gives 0xBB3D and CCITT-FALSE gives 0x29B1.
What is the difference between CRC-16/CCITT-FALSE, XMODEM and KERMIT?
All three use polynomial 0x1021. CCITT-FALSE starts from 0xFFFF and is not reflected (check value 0x29B1). XMODEM starts from 0x0000 and is not reflected (0x31C3). KERMIT starts from 0x0000 and is reflected (0x2189) — this is the "true" CCITT CRC defined in ITU-T V.41.
What does the polynomial 0xA001 mean?
0xA001 is 0x8005 with its 16 bits reversed. Reflected CRC-16 implementations such as MODBUS and ARC shift right and therefore store the polynomial bit-reversed. Likewise 0x8408 is the reflected form of 0x1021.
In which byte order is a CRC16 transmitted?
It depends on the protocol. Modbus RTU sends the low byte first. XMODEM and most CCITT-based protocols send the high byte first. The result panel shows both byte orders so you can copy the one your protocol needs.
How many errors can a CRC16 detect?
A 16-bit CRC detects every single-bit error, every burst error up to 16 bits long, and about 99.998% of longer random corruptions (all but 1 in 65,536). For messages longer than a few kilobytes, a 32-bit CRC is the safer choice.