Skip to content

CRC Checksum Calculator

Paste hex or text and get all 63 CRC-8, CRC-16 and CRC-32 variants at once. Got a checksum you cannot match? Type it in and the tool names the variant — MODBUS, CCITT-FALSE, XMODEM, KERMIT. Runs entirely in your browser.

No Tracking Runs in Browser Free
Everything is computed locally in your browser — the data you paste never leaves this device.
Try these

All 63 CRC variants — results and parameters

Every row recalculates as you type.
Variant Result Poly Init RefIn/RefOut XorOut
CRC-8
CRC-8/AUTOSAR 0x2F 0xFF false / false 0xFF
CRC-8/BLUETOOTH 0xA7 0x00 true / true 0x00
CRC-8/CDMA2000 0x9B 0xFF false / false 0x00
CRC-8/DARC 0x39 0x00 true / true 0x00
CRC-8/DVB-S2 0xD5 0x00 false / false 0x00
CRC-8/GSM-A 0x1D 0x00 false / false 0x00
CRC-8/GSM-B 0x49 0x00 false / false 0xFF
CRC-8/HITAG 0x1D 0xFF false / false 0x00
CRC-8/I-432-1 CRC-8/ITU 0x07 0x00 false / false 0x55
CRC-8/I-CODE 0x1D 0xFD false / false 0x00
CRC-8/LTE 0x9B 0x00 false / false 0x00
CRC-8/MAXIM-DOW CRC-8/MAXIM · DOW-CRC 0x31 0x00 true / true 0x00
CRC-8/MIFARE-MAD 0x1D 0xC7 false / false 0x00
CRC-8/NRSC-5 0x31 0xFF false / false 0x00
CRC-8/OPENSAFETY 0x2F 0x00 false / false 0x00
CRC-8/ROHC 0x07 0xFF true / true 0x00
CRC-8/SAE-J1850 CRC-8/J1850 0x1D 0xFF false / false 0xFF
CRC-8/SMBUS CRC-8 0x07 0x00 false / false 0x00
CRC-8/TECH-3250 CRC-8/AES · CRC-8/EBU 0x1D 0xFF true / true 0x00
CRC-8/WCDMA 0x9B 0x00 true / true 0x00
CRC-16
CRC-16/ARC CRC-16 · CRC-16/IBM · CRC-16/LHA 0x8005 0x0000 true / true 0x0000
CRC-16/CDMA2000 0xC867 0xFFFF false / false 0x0000
CRC-16/CMS 0x8005 0xFFFF false / false 0x0000
CRC-16/DDS-110 0x8005 0x800D false / false 0x0000
CRC-16/DECT-R R-CRC-16 0x0589 0x0000 false / false 0x0001
CRC-16/DECT-X X-CRC-16 0x0589 0x0000 false / false 0x0000
CRC-16/DNP 0x3D65 0x0000 true / true 0xFFFF
CRC-16/EN-13757 0x3D65 0x0000 false / false 0xFFFF
CRC-16/GENIBUS CRC-16/DARC · CRC-16/EPC · CRC-16/EPC-C1G2 · CRC-16/I-CODE 0x1021 0xFFFF false / false 0xFFFF
CRC-16/GSM 0x1021 0x0000 false / false 0xFFFF
CRC-16/IBM-3740 CRC-16/CCITT-FALSE · CRC-16/AUTOSAR 0x1021 0xFFFF false / false 0x0000
CRC-16/IBM-SDLC CRC-16/X-25 · CRC-16/X25 · CRC-16/ISO-HDLC · CRC-B · X-25 0x1021 0xFFFF true / true 0xFFFF
CRC-16/ISO-IEC-14443-3-A CRC-A 0x1021 0xC6C6 true / true 0x0000
CRC-16/KERMIT CRC-16/CCITT · CRC-16/CCITT-TRUE · CRC-16/V-41-LSB · CRC-CCITT 0x1021 0x0000 true / true 0x0000
CRC-16/LJ1200 0x6F63 0x0000 false / false 0x0000
CRC-16/M17 0x5935 0xFFFF false / false 0x0000
CRC-16/MAXIM-DOW CRC-16/MAXIM 0x8005 0x0000 true / true 0xFFFF
CRC-16/MCRF4XX 0x1021 0xFFFF true / true 0x0000
CRC-16/MODBUS 0x8005 0xFFFF true / true 0x0000
CRC-16/NRSC-5 0x080B 0xFFFF true / true 0x0000
CRC-16/OPENSAFETY-A 0x5935 0x0000 false / false 0x0000
CRC-16/OPENSAFETY-B 0x755B 0x0000 false / false 0x0000
CRC-16/PROFIBUS CRC-16/IEC-61158-2 0x1DCF 0xFFFF false / false 0xFFFF
CRC-16/RIELLO 0x1021 0xB2AA true / true 0x0000
CRC-16/SPI-FUJITSU CRC-16/AUG-CCITT 0x1021 0x1D0F false / false 0x0000
CRC-16/T10-DIF 0x8BB7 0x0000 false / false 0x0000
CRC-16/TELEDISK 0xA097 0x0000 false / false 0x0000
CRC-16/TMS37157 0x1021 0x89EC true / true 0x0000
CRC-16/UMTS CRC-16/BUYPASS · CRC-16/VERIFONE 0x8005 0x0000 false / false 0x0000
CRC-16/USB 0x8005 0xFFFF true / true 0xFFFF
CRC-16/XMODEM CRC-16/ACORN · CRC-16/LTE · CRC-16/V-41-MSB · ZMODEM 0x1021 0x0000 false / false 0x0000
CRC-32
CRC-32/AIXM CRC-32Q 0x814141AB 0x00000000 false / false 0x00000000
CRC-32/AUTOSAR 0xF4ACFB13 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/BASE91-D CRC-32D 0xA833982B 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/BZIP2 CRC-32/AAL5 · CRC-32/DECT-B · B-CRC-32 0x04C11DB7 0xFFFFFFFF false / false 0xFFFFFFFF
CRC-32/CD-ROM-EDC 0x8001801B 0x00000000 true / true 0x00000000
CRC-32/CKSUM CRC-32/POSIX 0x04C11DB7 0x00000000 false / false 0xFFFFFFFF
CRC-32/ISCSI CRC-32C · CRC-32/BASE91-C · CRC-32/CASTAGNOLI · CRC-32/INTERLAKEN 0x1EDC6F41 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/ISO-HDLC CRC-32 · CRC-32/ADCCP · CRC-32/V-42 · CRC-32/XZ · PKZIP 0x04C11DB7 0xFFFFFFFF true / true 0xFFFFFFFF
CRC-32/JAMCRC 0x04C11DB7 0xFFFFFFFF true / true 0x00000000
CRC-32/MEF 0x741B8CD7 0xFFFFFFFF true / true 0x00000000
CRC-32/MPEG-2 0x04C11DB7 0xFFFFFFFF false / false 0x00000000
CRC-32/XFER 0x000000AF 0x00000000 false / false 0x00000000
Custom parameters

Use this when your device documents a polynomial that is not in the table above.

Result
All 63 variant parameter sets are asserted against their published catalogue check values in the test suite, and CRC-32/ISO-HDLC is cross-checked against Node's built-in zlib.crc32 as an independent oracle. — Go Tools Team · Sep 6, 2026

Built and verified by the Go Tools engineering team.

Quick answers

CRC-32 of "123456789"

0xCBF43926 0xCBF43926 for CRC-32/ISO-HDLC, the variant used by ZIP, PNG, Ethernet and gzip.

CRC-16/MODBUS of "123456789"

0x4B37 0x4B37, with poly 0x8005, init 0xFFFF, input and output reflected, no final XOR.

CRC-16/CCITT-FALSE of "123456789"

0x29B1 0x29B1. Its formal catalogue name is CRC-16/IBM-3740: poly 0x1021, init 0xFFFF, no reflection.

How many CRC variants are there?

63 This calculator covers 63 catalogued variants: 20 of width 8, 31 of width 16 and 12 of width 32.

What is a CRC?

A cyclic redundancy check treats a block of data as the coefficients of a very long binary polynomial, divides it by a fixed generator polynomial using modulo-2 arithmetic, and keeps the remainder. That remainder is the checksum. The construction is popular because the division reduces to shifts and XORs, which costs almost nothing in hardware, and because the algebra gives hard guarantees rather than statistical hope: a well chosen 16-bit polynomial detects every single-bit error, every double-bit error within a useful block length, every odd number of bit flips, and every burst of 16 or fewer consecutive corrupted bits.

What makes CRC confusing in practice is that the polynomial is only one of six parameters. Two implementations can agree on the polynomial and still disagree on every result, because they differ in the register's initial value, in whether input bytes and the output register have their bit order reversed, and in the constant XORed into the final value. A CRC variant is that whole parameter set, not the polynomial alone — which is why a name like "CRC-16" identifies almost nothing on its own, and why this page prints the polynomial, the initial value, both reflection flags and the final XOR beside every result, with the width as the group heading.

One caveat the table cannot show: a 16-bit polynomial detects every odd number of bit flips only when x+1 divides it. That holds for the two you are most likely to meet, 0x1021 and 0x8005, but not for all of them — CRC-16/T10-DIF and CRC-16/PROFIBUS are among the exceptions.

// CRC-16/MODBUS: poly=0x8005, init=0xFFFF, refin/refout=true, xorout=0x0000
// Written in the reflected form, so the polynomial appears bit-reversed as 0xA001.
function crc16Modbus(bytes) {
  let crc = 0xffff;
  for (const byte of bytes) {
    crc ^= byte;
    for (let i = 0; i < 8; i++) {
      crc = crc & 1 ? (crc >>> 1) ^ 0xa001 : crc >>> 1;
    }
  }
  return crc;
}

crc16Modbus([0x01, 0x03, 0x00, 0x00, 0x00, 0x0a]); // 0xCDC5
// On the wire Modbus RTU sends the low byte first: ... 0x0A 0xC5 0xCD

What this calculator does

All 63 variants at once

CRC-8, CRC-16 and CRC-32 recalculate together as you type. No dropdown to guess at before you can see anything.

Reverse lookup

Type the checksum you were given and the variants that produce it are highlighted, so identifying an unknown algorithm takes one step instead of twenty.

Formal names and manual names

Every row shows the RevEng catalogue name plus the aliases used in the field — CCITT-FALSE, CRC-16/IBM, CRC-32C, X-25 and the rest.

Full parameter table

Polynomial, initial value, both reflection flags and final XOR sit beside each result, so you can verify a match against a specification.

Custom parameters

Width, polynomial, init, reflection and final XOR are all editable for polynomials that never made it into a catalogue.

Runs entirely offline

Computation happens in your browser. Production frames and firmware images never leave the machine.

Worked examples

The catalogue check value

123456789
CRC-32/ISO-HDLC = 0xCBF43926, CRC-16/MODBUS = 0x4B37, CRC-8/SMBUS = 0xF4

Every CRC variant in the RevEng catalogue publishes its result for the ASCII string 123456789. That makes this input the standard self-test: if a library disagrees with the table here, the library is wrong.

A Modbus RTU request frame

01 03 00 00 00 0A
CRC-16/MODBUS = 0xCDC5

Read holding registers from slave 1. Modbus RTU appends the CRC low byte first, so this frame goes on the wire as 01 03 00 00 00 0A C5 CD — a reversal that accounts for a large share of the checksums people cannot match.

Same bytes, four CRC-16 answers

DEADBEEF
MODBUS = 0xC19B, CCITT-FALSE = 0x4097, XMODEM = 0xC457, KERMIT = 0x1915

Read in Hex mode, so four bytes rather than the eight characters of the string. The four best known CRC-16 variants disagree completely on them. Nothing is broken: they differ in initial value, reflection and final XOR, not in correctness.

Reverse lookup from a device response

123456789 with expected value 0x29B1
CRC-16/IBM-3740 (your manual may call it CRC-16/CCITT-FALSE)

This is the case the calculator is built for. You have data and the checksum somebody else computed, but not the variant name — so you search for the parameter set that reproduces it.

How to use the CRC calculator

  1. 1

    Choose text or hex

    Protocol frames are almost always hex. Use text only when you are checksumming a literal string, such as the 123456789 self-test value.

  2. 2

    Paste your data

    In hex mode separators are ignored, so 01 03 00 00 00 0A, 0x01 0x03 and 010300 00000A are all accepted.

  3. 3

    Read the variant you need

    The table is grouped by width. Formal names come from the RevEng catalogue, with the aliases your device manual is likely to use printed underneath.

  4. 4

    Or work backwards

    If you already have a checksum and want its variant, type it into the expected-value box and read the highlighted row.

Why your checksum does not match

Checksumming the text "01 03" instead of the bytes

Left in text mode, the calculator hashes the ASCII characters of your hex dump rather than the bytes it represents. Switch to Hex mode — the byte count under the mode switch tells you which reading you got.

✗ Wrong
Text mode, input "01 03" -> 5 bytes: 30 31 20 30 33
✓ Correct
Hex mode, input "01 03" -> 2 bytes: 01 03

Comparing against a byte-swapped checksum

Modbus RTU transmits the CRC low byte first. A frame ending C5 CD carries the checksum 0xCDC5, not 0xC5CD.

✗ Wrong
expected 0xC5CD  (bytes read in transmission order)
✓ Correct
expected 0xCDC5  (bytes reassembled low-byte-first)

Including the checksum field in its own calculation

The CRC covers the bytes before it. Feeding the whole frame back in, trailer included, produces a residue rather than the checksum.

✗ Wrong
01 03 00 00 00 0A C5 CD    <- trailer included
✓ Correct
01 03 00 00 00 0A          <- payload only

Assuming "CRC-16" identifies an algorithm

Thirty-one catalogued variants are 16 bits wide. Without the other five parameters the name narrows nothing down.

✗ Wrong
spec says: "trailer is a CRC-16"
✓ Correct
spec says: "CRC-16/MODBUS, poly 0x8005, init 0xFFFF, refin/refout true"

When you need this

Debugging a Modbus link
A PLC rejects your frames and you need to know whether the CRC is wrong or merely byte-swapped. Compute CRC-16/MODBUS and compare both orderings.
Identifying an undocumented protocol
You captured traffic with a two-byte trailer that looks like a checksum. Feed the payload and the trailer to the reverse lookup and see which variant claims it.
Porting firmware between toolchains
A vendor library and your own implementation disagree. Comparing both against the catalogue check value shows which one drifted.
Writing or reviewing a specification
Naming "CRC-16" in a protocol document guarantees interoperability bugs. The parameter table gives you the six values that actually pin the algorithm down.
Verifying stored data
Filesystems, archive formats and flash images carry CRC-32 fields. Recomputing one tells you whether a block survived intact.

How CRC works

Polynomial representation
The table prints polynomials in normal (MSB-first) form: 0x8005 means x^16 + x^15 + x^2 + 1. Reflected implementations often show the same polynomial as 0xA001, and Koopman notation shifts it differently again. Three notations for one polynomial is a common source of failed ports.
The initial value
Starting the register at 0xFFFF rather than 0x0000 makes the checksum sensitive to leading zero bytes. With a zero init, prefixing a message with zeros leaves the CRC unchanged — which is exactly the corruption a framed protocol needs to catch.
Reflection
refin reverses bits within each input byte, refout reverses the final register. Hardware clocks bits MSB-first while byte-oriented software finds LSB-first cheaper, and the reflected parameter forms reconcile the two.
Final XOR
xorout is applied last, and it is not simply init at the other end. Zero bytes appended to the message are caught either way. What a non-zero xorout changes is the residue a receiver gets when it runs the CRC over message and checksum together: with xorout zero that residue is itself zero, so zeros appended after the CRC field still pass. It also makes the all-zero message produce a non-zero checksum.
The check value
Every catalogued variant publishes its result for the ASCII string 123456789. The 63 values shown on this page when that input is loaded are exactly those published constants, which is how the engine on this page is tested.

Getting a matching result

Name the parameters, not the algorithm
Write "poly 0x1021, init 0xFFFF, refin false, refout false, xorout 0x0000" in specifications. "CRC-16/CCITT" has meant at least three different things.
Check the byte order separately
When a checksum is one byte-swap away from matching, the algorithm is right and the framing is wrong. Treat those as two different bugs.
Validate against the check value first
Before debugging your data, confirm your implementation returns the catalogue value for 123456789. It separates a broken algorithm from a broken input in seconds.
Be explicit about what is covered
Most mismatches come from including or excluding start markers, addresses or length fields. Decide exactly which bytes the CRC spans and write it down.
Do not use CRC where a MAC is needed
CRC is linear and trivially forgeable. If an adversary could modify the data, use HMAC instead.

Frequently asked questions

Why does my device return a different CRC than this calculator?
Almost always because you are comparing two different variants. CRC-16 alone has 31 catalogued parameter sets, and MODBUS, CCITT-FALSE, XMODEM and KERMIT produce four unrelated numbers from identical bytes. Put the device's value in the expected-value box: if any variant reproduces it, the matching row is highlighted and you have your answer. If nothing matches, the data being hashed is not what you think it is — check byte order, and check whether the frame's start and end markers are included in the calculation.
Which CRC-16 does Modbus use?
CRC-16/MODBUS: polynomial 0x8005, initial value 0xFFFF, input and output both reflected, no final XOR. The frequent point of confusion is transmission order rather than the algorithm — Modbus RTU sends the CRC low byte first, so a frame whose CRC is 0xCDC5 carries the bytes C5 CD at the end. See the CRC-16 variants guide for a worked frame.
What is the difference between CRC-16/CCITT and CRC-16/CCITT-FALSE?
They are different algorithms with confusingly similar names, which is why the RevEng catalogue renamed both. What people call CCITT-FALSE is CRC-16/IBM-3740: initial value 0xFFFF, no reflection. What is usually meant by plain CCITT is CRC-16/KERMIT: initial value 0x0000, input and output reflected. This calculator shows both the formal name and the name your device manual is likely to use.
Can CRC detect that a file has been tampered with?
No. CRC is an error-detection code designed for accidental corruption on a noisy channel, and it is linear — anyone can modify a message and adjust it so the CRC still matches. For integrity against a deliberate attacker use a cryptographic hash such as SHA-256, or an authenticated construction like HMAC. CRC is excellent at what it was built for and offers no security at all.
What do refin and refout actually do?
refin reverses the bit order within each input byte before it is fed to the register; refout reverses the bit order of the final register. They exist because hardware shift registers and software table implementations clock bits in opposite directions, and the reflected forms let both arrive at the same number. They are not the same thing as byte order — reflection acts on bits inside a byte, while endianness decides the order of the bytes themselves.
I only have the checksum, not the data. Can the tool work backwards?
No, and no tool can. A CRC compresses an arbitrarily long message into 8, 16 or 32 bits, so countless different messages share any given value — this is not a matter of effort. The reverse lookup on this page answers a narrower question: given the data and a checksum somebody computed from it, which parameter set connects the two. If you captured a device response but not the payload behind it, capture the payload first. On choosing between widths rather than identifying one, see the CRC-16 variants guide.
Why does the calculator show 63 variants when my device only lists one?
Because the useful question is usually not "compute a CRC" but "which of these produced the value I am holding". Tools that make you pick a variant first assume you already know the answer. Showing every variant at once turns identification into a single lookup, and the parameter columns let you confirm the match against the specification rather than trusting a name.
Is my data sent anywhere?
No. The whole calculation runs in your browser using the same engine that rendered the table on this page — there is no upload, no API call and no logging. You can disconnect from the network and the tool keeps working, which matters because CRC inputs are often production frames or firmware images.

Related Tools

View all tools →