CRC-16 Checksum Calculator
EncodingEverything runs locally in your browser — nothing is uploaded
Compute the CRC-16 checksum of any text. CRC-16 shows up in industrial and embedded work more often than CRC-32 — the two trailing bytes of a Modbus frame, the ROM checksum of a 1-Wire device, the frame check in Bluetooth and X.25 all use it. It is also the family with the most variants by far: one polynomial such as 0x8005 or 0x1021, combined with different initial values, bit reflection and final XOR values, yields more than thirty incompatible algorithms whose numbers bear no relation to one another. Nine of the most common are collected here, each labelled with its use and origin. Check which one the other system expects before switching — this is where CRC tooling goes wrong most often, and where it is hardest to diagnose.
Features
- Nine common variants: ARC, Modbus, USB, MAXIM, CCITT-FALSE, XMODEM, KERMIT, X-25 and DNP
- Each variant says where it is used — Modbus frames, 1-Wire devices and X.25 frames each need a specific one
- Output as hexadecimal (upper or lower case) or decimal
- Non-ASCII text hashed as UTF-8 bytes, matching other implementations
- Every variant is anchored to the catalogue check value, so parameters cannot be mistyped
- Computed locally; your content never leaves the browser
How to use
- Paste your content; the result appears as you type
- Pick the variant the other system uses (choose CRC-16/MODBUS for Modbus)
- Switch between hex and decimal, or uppercase, as needed
- Click Copy to take the checksum
FAQ
- Why are there so many CRC-16 variants?
- Because the 16 in CRC-16 only says the checksum is 16 bits wide and nothing else. Which polynomial, what initial value, whether input bytes are reflected, and whether the result is XORed with a constant — those four parameters were decided independently by different vendors over the years, producing dozens of incompatible implementations under one name. ARC (also called IBM) came first; Modbus, USB and X-25 are variants of it for their own contexts. Names do not tell you which is which, which is why every entry here is labelled with its use.
- Which one does Modbus use?
- CRC-16/MODBUS: polynomial 0x8005, initial value 0xFFFF, both input and output reflected, no final XOR. It occupies the last two bytes of a Modbus RTU frame, low byte first. Note that Modbus TCP does not use it (the Ethernet layer below handles integrity); only RTU and ASCII modes need it computed by hand.
- How do I find out which variant the other system uses?
- Three ways, in order of reliability. First, the protocol documentation, which usually states the polynomial and initial value. Second, find a known verification value — the standard check input is the string 123456789, and every variant here matches the value registered in the CRC catalogue, so you can try them until one lines up. Third, read the source: the reflected form of 0x8005, which is 0xA001, appearing in code almost always means the ARC family.
- Why does my result not match the value in the manual?
- Two causes account for nearly all cases. Either the variant is wrong — from the same 0x8005 polynomial, ARC gives BB3D, Modbus gives 4B37 and MAXIM gives 44C2 — or the byte range is wrong. CRC operates on a byte stream, so if you paste only the payload while the other side computes over the whole frame (address, function code and data), the results cannot agree. Confirm that both sides cover exactly the same bytes.
Related tools
CRC-32
EncodingCompute CRC-32 checksums of any text across six variants including IEEE, Castagnoli and Koopman, with a note on where each one is used.
Hex Converter
EncodingConvert between hexadecimal and text, accepting 0x, \x, spaces and colons, with UTF-8 byte counts shown. Runs in your browser.
Hash
EncodingCompute MD5, SHA-1, SHA-256, SHA-512 or MD4 digests of any text, hashed as UTF-8 bytes so they match openssl exactly. Runs in your browser.
Base64
EncodingConvert text to Base64 and back, with correct UTF-8 handling for accents, CJK and emoji. Runs entirely in your browser — nothing is uploaded.
URL Encode
EncodingEscape text into %XX form and back again, treating a whole URL and a single parameter value as different jobs. Runs entirely in your browser.
HTML Entities
EncodingTurn < > & and quotes into HTML entities and decode them back in a single pass, so &lt; becomes <, not an angle bracket. Runs in your browser.