CRC32 Checksum Calculator
Compute CRC32 for any text or file locally, print it in hex, decimal, and binary, and verify it against an expected value in one click.
Firmware engineers, release managers, game modders, and data pipeline maintainers reach for CRC32 whenever a format specifies it: PNG chunks, ZIP headers, git objects, Ethernet frames, and embedded bootloaders all carry 32-bit polynomial checksums. When to use it: Confirming a downloaded archive matches the published value, reproducing a checksum from a hex dump, checking whether a text field lost a newline during transfer, or validating that your own CRC implementation matches the reference check string. What it solves: Hashes text as UTF-8 bytes or any file byte-for-byte, prints the digest in three representations, and compares your data against an expected hex or decimal value with a clear match badge. Why it matters: CRC mismatches usually come from invisible byte differences, and computing both sides in the same browser tab isolates the data problem from the tooling problem.
Text is encoded as UTF-8 bytes before hashing, matching how most servers and scripts hash strings.
Variant Parameters
| Polynomial | 0x04C11DB7 (reflected 0xEDB88320) |
| Initial value | 0xFFFFFFFF |
| Final XOR | 0xFFFFFFFF |
| Input / output reflected | true / true |
| Check ("123456789") | 0xCBF43926 |
How CRC32 Calculation Works
CRC32 treats your data as a stream of bits and divides it by a fixed generator polynomial, keeping only the 32-bit remainder. In practice the division is done with a 256-entry lookup table: the current CRC value is shifted, XORed with the next byte, and reduced through the table in a single pass over the input. The table itself is generated once from polynomial 0xEDB88320 using the same eight shift-and-XOR steps the hardware performs.
The register starts at 0xFFFFFFFF because starting from zero would let leading zero bytes go undetected. After the last byte, the register is inverted with a final XOR against 0xFFFFFFFF. That combination of reflected input, reflected output, initial value, and final XOR is what distinguishes the common CRC-32 from variants like CRC-32C (Castagnoli) used by iSCSI and Btrfs, or CRC-32MPEG used in video multiplexing.
Text input is converted with TextEncoder, so each character becomes its UTF-8 byte sequence. A 3-byte emoji therefore contributes three bytes, not one code point. File input is read as an ArrayBuffer with no modification, so the checksum covers exactly the bytes on disk.
Verification normalizes the expected value by stripping any 0x prefix and non-hex characters, then compares the last 8 hex digits against the computed digest. Both sides use the same canonical form, so "cbf43926", "CBF43926", and the decimal form of the same number all match.
Before / After Examples
Example 1: Reference Check String
Before (ASCII input)
123456789
<!-- The standard CRC32 test vector --> After (Computed checksum)
hex: CBF43926
decimal: 3421780262
binary: 11001011 11110100 00111001 00100110
<!-- Matches the published check value --> Example 2: Verifying a Published Digest
Before (Mismatch scenario)
data: "release notes\n"
computed: 7A2B1C09
expected: 3D8812F4
<!-- Mismatch: bytes differ somewhere --> After (Match confirmed)
data: "release notes\n"
computed: 3D8812F4
expected: 3d8812f4
✓ MATCH — same bytes, case-insensitive compare Example 3: UTF-8 Text vs Latin Bytes
Before (Multibyte character)
café
<!-- 4 chars, but how many bytes? --> After (UTF-8 byte hashing)
bytes: 63 61 66 C3 A9 (5 bytes)
crc32: 6E4D9A2F (example)
<!-- é becomes two UTF-8 bytes, not one --> Use Cases
| Developer | Production | Workflow |
|---|---|---|
| Validate a hand-written CRC implementation against the check vector | Confirm a downloaded ZIP matches the release digest | Compare checksums before and after a migration script |
| Reproduce a CRC32 seen in an embedded debug log | Check PNG chunk integrity when a render pipeline corrupts images | Hand a QA engineer a reference value for a test fixture |
| Hash config text to detect accidental edits in code review | Verify firmware images before flashing in manufacturing | Audit which files changed by comparing stored CRC values |
| Compare CRC-32 output with CRC-32C to confirm a variant switch | Spot line-ending drift between Linux and Windows build agents | Document the exact bytes a legacy protocol expects |
Common Mistakes & Troubleshooting
Comparing CRC32C with plain CRC-32
CRC-32C uses the Castagnoli polynomial 0x1EDC6F41 and powers iSCSI, ext4 metadata, and Btrfs. It produces different values for identical input, so a mismatch against a CRC-32C reference does not mean your bytes are wrong. Confirm which variant the spec names before debugging the data.
❌ Expect zlib CRC32 to match an iSCSI tag
✅ Check the spec: CRC-32 (0x04C11DB7) vs CRC-32C (0x1EDC6F41) Hashing text with mixed line endings
A file saved with CRLF line endings has two extra bytes per line compared to LF. The CRC will differ even though every visible character matches. Normalize line endings before hashing when comparing files across operating systems.
❌ Compare CRLF checkout vs LF checkout digests
✅ Normalize to LF first, or hash raw bytes consistently Trusting CRC32 for security
CRC32 is linear and 32 bits wide, so an attacker can modify data and recompute the checksum trivially. Never use it for password storage, code signing, or tamper evidence. Use SHA-256 for integrity that must hold against a hostile party.
❌ if (crc(userInput) == storedCrc) grantAccess()
✅ SHA-256 with a salt for anything security-relevant Cutting off the leading zeros
CRC32 always occupies 8 hex digits. A value like 0000AB12 is often logged or pasted as "AB12", and a comparison that requires an exact-length string fails even though the numbers are equal. This tool pads to 8 digits and normalizes pasted expectations, but your own comparison code should pad too.
❌ computed === "AB12"
✅ computed.padStart(8, "0") === expected.padStart(8, "0") Forgetting that hashes cover bytes, not characters
If your server hashes a string as Latin-1 while your browser encodes UTF-8, any non-ASCII character produces a different checksum. Keep the encoding decision explicit on both sides and test with a multibyte sample before shipping.
❌ Assume "café" is 4 bytes everywhere
✅ Agree on UTF-8 and test a non-ASCII sample Best Practices
Pin the variant in your documentation
Write "CRC-32 (ISO 3309, reflected, init 0xFFFFFFFF)" next to stored digests. Future maintainers can then pick the right library on any platform.
Store 8-digit uppercase hex
Padding and case consistency make string comparisons trivial in scripts, logs, and golden files, and match how archives print their digests.
Test your implementation with 123456789
The ASCII string 123456789 must hash to 0xCBF43926 under standard CRC-32. One unit test catches polynomial, reflection, and final-XOR mistakes at once.
Pair with SHA-256 for release artifacts
Publish CRC32 for quick client-side checks and SHA-256 for the authoritative integrity statement in release notes.
Normalize bytes before comparing
Decide once whether line endings, BOMs, and trailing newlines are included, then apply that rule on every side that computes a checksum.
Hash files as raw bytes
Reading a file as text can normalize newlines or strip bytes. Use ArrayBuffer or Buffer reads so the digest reflects the exact stored bytes.
Keep client-side checks on the client
Computing CRC in the browser avoids a server round-trip and keeps unreleased files private. Server verification still matters for untrusted uploads.
Record the byte count next to the digest
A length mismatch explains most checksum failures instantly, before anyone diffs the payload itself.
Frequently Asked Questions
What is a CRC32 checksum used for? +
CRC32 is a 32-bit cyclic redundancy check that detects accidental corruption in data. It appears in ZIP and gzip archives, PNG and PDF files, Ethernet frames, git packfiles, BTRFS and ext4 filesystems, and countless embedded protocols. It is fast to compute and great at catching burst errors, but it is not a cryptographic hash: it does not protect against deliberate tampering and should never be used for passwords, signatures, or integrity against an attacker.
How is CRC32 different from MD5 or SHA-256? +
MD5 and SHA-256 are cryptographic hash functions designed so that finding two inputs with the same digest is infeasible, and they produce 128-bit and 256-bit digests. CRC32 is a polynomial checksum built for speed in hardware and network stacks, and it only produces 32 bits, so collisions are easy to find on purpose. Use CRC32 when a format or protocol demands it, and use SHA-256 when you need integrity you can trust.
Which CRC32 variant does this tool compute? +
This tool computes the standard CRC-32 variant defined by ISO 3309, ITU-T V.42, and used by Ethernet, ZIP, PNG, and gzip. It uses the reflected polynomial 0x1EDC6F41 normally written as 0xEDB88320 in reflected form, an initial value of 0xFFFFFFFF, and a final XOR of 0xFFFFFFFF. The check value for the ASCII string "123456789" is 0xCBF43926, which the tool reproduces exactly.
Can I verify a CRC32 I already have? +
Yes. Paste the expected value into the verify field in hex (with or without a 0x prefix, any case) or as a decimal number, and the tool normalizes both sides before comparing. A green match badge confirms your data produced the same checksum, while a mismatch shows both values so you can spot byte-level differences such as a missing newline or wrong line endings.
Does this tool upload my file or text? +
No. Files are read with the browser FileReader API and text is encoded with TextEncoder, then both are hashed in page JavaScript. There is no upload endpoint and no network request in the conversion path. That matters when you are checking checksums of unreleased firmware, private documents, or anything under NDA.
Why does CRC32 of my file not match the published value? +
The most common causes are line-ending differences on Windows, an extra BOM at the start of the file, or a different CRC variant such as CRC-32C (Castagnoli) used by iSCSI, ext4, and Btrfs. This tool computes plain CRC-32 over the exact bytes you provide, so compare the byte counts and confirm the variant before assuming the data is wrong.
Is CRC32 good enough for file integrity checks? +
For detecting accidental corruption during a download or transfer, yes, CRC32 has decades of real-world use in archives and filesystems. For security-sensitive integrity, no: an attacker can craft a different file with the same CRC32 quickly. Pair CRC32 with SHA-256 when the guarantee needs to hold against tampering, and note that the Web Crypto API does not expose MD5, so some older tools fall back to JavaScript implementations for it.
Related Tools
SHA-256 Hash Generator
Compute cryptographic SHA-256 digests
MD5 Hash Generator
Produce MD5 hashes for legacy comparisons
File Checksum Verifier
Verify MD5, SHA-1, SHA-256, and SHA-512 for files
Text to Hex
Inspect the exact bytes a string encodes to
SRI Generator
Build Subresource Integrity hashes for scripts
Base64 Encoder
Encode bytes as Base64 for transport