CRC-16 Calculator: Compute Modbus, CCITT, and DNP3 Checksums Online
Compute CRC-16 checksums across 10 variants — Modbus, CCITT-FALSE, XMODEM, Kermit, X-25, IBM, USB, MAXIM, GENIBUS, and DNP3 — from text or hex input, with full polynomial parameters and instant hex, decimal, and binary output.
Free Interactive Tool
CRC-16 Calculator
Compute CRC-16 checksums for Modbus, CCITT, XMODEM, Kermit, X-25, DNP3 and more, with full polynomial parameters
Table of Contents
If you have ever stared at a hex dump of a Modbus RTU frame wondering why the device keeps rejecting your commands, the answer was almost certainly a bad CRC. The CRC-16 family of checksums protects billions of messages every day — on factory floors, in power grids, inside vehicle buses, and in firmware images. Each protocol layer that uses CRC-16 has its own flavor: a different polynomial, a different initial value, different bit-ordering rules. Get any one of those details wrong and your frame is silently dropped.
The free online CRC-16 Calculator takes the guesswork out of the equation. Paste your data as plain text or hex bytes, pick the variant your protocol uses, and get the checksum instantly — along with the full parameter table (polynomial, initial value, refin, refout, xorout) and the result in hex, decimal, and binary. Everything runs client-side in your browser, so your data never leaves your machine.
This guide explains what the tool does, how each CRC-16 parameter works, and where these checksums show up in real projects. Whether you are wiring up an RS-485 sensor network, validating a firmware payload, or debugging a SCADA link, you will find a workflow here that saves you time.
Why Use CRC-16 Calculator?
- Ten variants, one tool. Modbus, CCITT-FALSE, XMODEM, Kermit, X-25, IBM (ARC), USB, MAXIM, GENIBUS, and DNP3 are all built in — no more hunting for a separate implementation every time a datasheet mentions a different flavor.
- Verified against the CRC catalog. The check values match the well-known CRC-16/ARC catalog (for example, the CRC-16/ARC of the ASCII string "123456789" is 0xBB3D), so you can trust the output for production work.
- Text and hex input modes. Type a plain string for quick experiments, or enter exact hex bytes like 01 03 00 6B 00 01 when you need byte-accurate protocol frames.
- Full parameter transparency. The tool shows the polynomial, initial value, input/output reflection, and XOR-out for the selected variant — exactly what you need when cross-checking a datasheet or writing your own implementation.
- File upload up to 10MB. Drop in a binary file and compute the checksum over its raw bytes, with automatic hex conversion for inspection.
- Runs 100% in your browser. No account, no upload, no telemetry. Your frames, firmware, and captured traffic stay on your device.
Key Features
| Feature | What You Get |
|---|---|
| 10 CRC-16 variants | Modbus, CCITT-FALSE, XMODEM, Kermit, X-25, IBM/ARC, USB, MAXIM, GENIBUS, DNP3 |
| Input modes | Plain text (UTF-8) or hex byte strings |
| File support | Upload up to 10MB, converted to hex automatically |
| Parameter table | Poly, Init, RefIn, RefOut, XorOut for every variant |
| Output formats | Hexadecimal, decimal, and binary with one-click copy |
| Check values | Verified against the CRC-16/arc catalog |
| Privacy | Fully client-side — nothing is transmitted |
A few details deserve a closer look:
- Correct catalog check values matter. Many online calculators return plausible-but-wrong results for exotic variants. This tool is validated against the reference catalog, so the checksum you copy is the checksum your device expects.
- Hex, decimal, and binary side by side. Firmware work often needs the binary form to see reflected bits; documentation usually quotes hex. Having all three — plus one-click copy — removes an entire class of transcription errors.
- Byte-accurate hex input. Whitespace, commas, and 0x prefixes are tolerated, so you can paste a frame straight from a logic analyzer capture.
How to Use
- Open the tool at CRC-16 Calculator. It loads instantly and works offline once cached.
- Choose your input mode. Select Text to checksum a string, Hex to paste raw bytes (e.g. 01 03 00 6B 00 01), or upload a file up to 10MB.
- Pick the CRC-16 variant your protocol specifies. Not sure which one? The parameter table underneath updates with the polynomial and init value — match those against your datasheet.
- Click Calculate. The 16-bit checksum appears immediately in hex, decimal, and binary, together with the full parameter table.
- Copy the result with one click and append it to your frame in the correct byte order. For Modbus and other reflected variants, remember the low byte goes on the wire first.
That's the entire workflow — under ten seconds once you know your variant.
Understanding CRC-16 Parameters
Two implementations can both say "CRC-16" and still disagree on every input. The difference is always in five parameters:
- Polynomial (poly). The divisor that defines the math. Common 16-bit polynomials are 0x8005 (used by Modbus, ARC, USB, MAXIM) and 0x1021 (used by CCITT-FALSE, XMODEM, Kermit, X-25, GENIBUS). DNP3 is the outlier with 0x3D65. The polynomial is usually named in the datasheet — if only the name is given, the rest still matters.
- Initial value (init). The register's starting state before the first byte. 0x0000 and 0xFFFF are the common choices. A different init produces a completely different checksum for the same data — this is the single most common source of "my CRC doesn't match" bugs.
- Input reflection (RefIn). Whether each input byte is processed least-significant-bit first. Modbus reflects input; XMODEM does not. Reflection is a legacy of hardware serial shift registers and trips up every software implementation written from scratch.
- Output reflection (RefOut). Whether the final register is mirrored before the result is produced. RefIn and RefOut are almost always set to the same value.
- XOR-out (XorOut). A final XOR mask applied to the result. X-25 and USB XOR with 0xFFFF; Modbus uses 0x0000. This step can make two otherwise-identical implementations differ by a bit inversion.
The combination is so distinctive that the CRC catalog gives each variant a check value: the CRC of the reference string "123456789". For example, CRC-16/ARC (poly 0x8005, init 0x0000, reflected) gives 0xBB3D, while CRC-16/MODBUS (same polynomial, init 0xFFFF) gives 0x4B37, and CCITT-FALSE (poly 0x1021, init 0xFFFF, unreflected) gives 0x29B1. If your implementation reproduces those three numbers, it is almost certainly correct.
One more practical subtlety: byte order on the wire. Most serial protocols transmit the 16-bit checksum little-endian — low byte first. A Modbus frame ending in 0x4B37 sends 37 4B as its final two bytes. The calculator gives you the logical 16-bit value; assembling the frame is up to you.
Practical Use Cases
Modbus RTU Frames over RS-485
Modbus RTU ends every request and response with a CRC-16/MODBUS checksum. When a slave device ignores your commands, recompute the frame's CRC with the tool, paste the hex bytes exactly as they go on the wire, and compare. Field engineers commonly keep the calculator open in a browser tab next to their serial monitor for exactly this purpose.
Verifying Firmware and Hex Dumps
Bootloaders and OTA update routines frequently append a CRC-16 to an image to detect flash corruption. Upload the binary (up to 10MB), select the variant documented in the bootloader source, and confirm the trailer value before flashing — a two-minute check that can save a bricked device.
DNP3 and SCADA Telegrams
DNP3, the dominant protocol in North American utility automation, uses CRC-16/DNP3 (poly 0x3D65, reflected, xorout 0xFFFF) on every link-layer frame. When integrating with a substation RTU or relay, the tool's parameter table doubles as a spec sheet: confirm poly, init, and reflection before writing a single line of parser code.
Debugging Protocol Integrations
When two systems disagree, checksum both sides. Capture the bytes each side transmits, run both through the calculator with the same variant, and you will know instantly whether the bug is in the data, the CRC computation, or the byte order. It turns a vague "device rejects my frame" problem into a precise, fixable diff.
Best Practices
- Confirm the exact variant name before anything else. "CCITT CRC-16" is ambiguous — datasheets use it for CCITT-FALSE, XMODEM, and Kermit alike. Match the check value, not just the name.
- Validate your setup with "123456789". Checksum the reference string in the tool and in your firmware; if both match the catalog value, your pipeline is wired correctly.
- Use hex mode for real protocol work. Text mode is convenient, but UTF-8 encoding can inject bytes you did not intend. Hex input guarantees byte-accurate frames.
- Watch byte order when appending results. Reflected variants like Modbus and Kermit conventionally go on the wire low-byte first; document the convention in your protocol notes.
- Compute checksums over the exact byte range the spec defines. Including or excluding address bytes, length fields, or headers is the classic off-by-one of checksum debugging.
- Never "fix" a CRC mismatch by trying random variants. One mismatch means a parameter is wrong; derive the parameters from the datasheet or a known-good implementation, then verify with the check value.
Start Computing CRC-16 Checksums Now
The CRC-16 Calculator is free, requires no sign-up, and runs entirely in your browser. Ten protocol variants, catalog-verified check values, hex/decimal/binary output, and file support up to 10MB — everything you need to stop guessing and start verifying. Open it in a tab and keep it next to your serial console.
Related Tools You Might Like:
- CRC-32 Checksum Calculator — for 32-bit checksums used in ZIP, PNG, and Ethernet
- Hash Type Identifier — identify which hash algorithm produced an unknown digest
- Base64 Tool — encode and decode Base64 payloads with an offline-first workflow
Happy computing!
Frequently Asked Questions
Q: What is the difference between CRC-16/Modbus and CRC-16/CCITT?
A: They use different polynomials and initial values. Modbus uses poly 0x8005 with init 0xFFFF and reflected I/O, while CCITT-FALSE uses poly 0x1021 with init 0xFFFF and no reflection. Same input, entirely different checksum — always match the exact variant your protocol documents.
Q: Why does my computed CRC-16 not match the device's checksum?
A: The most common causes are the wrong variant (init value differs), wrong byte range (a header byte included or excluded), or wrong byte order when appending the result. Verify your configuration using the reference string "123456789" and compare against the catalog check values.
Q: What is the check value for?
A: The check value is the CRC of the standard test string "123456789", published in the CRC catalog for every variant. For example, CRC-16/ARC gives 0xBB3D and CRC-16/MODBUS gives 0x4B37. It lets you verify an implementation in one step without any real protocol data.
Q: Can I compute a CRC-16 over a binary file, not just text?
A: Yes. The tool accepts file uploads up to 10MB, converts the raw bytes to hex, and computes the checksum over the exact file contents — useful for firmware images and configuration blobs.
Q: Is my data uploaded to a server?
A: No. The entire calculation runs client-side in your browser with JavaScript. Your text, hex frames, and files never leave your device, which makes the tool safe for proprietary protocol data.