CRC Lookup Table Generator – CRC32, CRC16, CRC8 Table Viewer & Export
What is a CRC Lookup Table?
A CRC lookup table is a precomputed array of 256 values that accelerates byte-wise CRC calculation. Instead of processing each bit individually, a byte-at-a-time implementation XORs the input byte with the current CRC, uses the result as an index into the 256-entry table, and combines the table value with the shifted accumulator — reducing an 8-step inner loop to a single table lookup.
This generator computes the authoritative 256-entry table for any supported CRC algorithm. Every entry is derived directly from the algorithm's polynomial and reflection settings, so the table matches what embedded and systems code actually uses at runtime.
How to Use This Tool
Settings Panel
The settings panel on the left controls what the tool generates:
- CRC Algorithm — Select any of the 100+ CRC algorithms from the dropdown, ranging from CRC-3 through CRC-64. The list follows the Catalogue of CRC Algorithms naming convention. Popular choices include CRC-32/ISO-HDLC (Ethernet, ZIP), CRC-16/MODBUS (industrial serial), CRC-8/MAXIM-DOW (1-Wire sensors), and CRC-64/WE (storage). Changing the algorithm instantly regenerates the full table.
- Output Format — Switch between Table and Script views. Table mode shows all 256 entries in a grid for visual inspection. Script mode generates a ready-to-paste array declaration for your target language.
- Table Format (Table mode only) — Choose how numeric values are displayed: Hex (e.g. 0x77073096), Decimal (e.g. 1996959894), or Binary (e.g. 0b01110111...). Hex is the most common format for embedded development.
- Language (Script mode only) — Select the target programming language for the exported array declaration: C, C++, Go, Java, JavaScript, Kotlin, Python, Rust, Swift, or TypeScript. Each export includes a comment header with the algorithm name and all parameters (poly, init, refin, refout, xorout).
Result Panel
The result panel shows three sections:
- Summary — Displays the algorithm's key parameters at a glance: Width (bit size), Poly (generator polynomial), Init (initial CRC value), XOR-out (final XOR mask), Check (CRC of
"123456789"), Residue (expected CRC remainder for valid frames), RefIn (whether input bytes are bit-reflected), RefOut (whether the final CRC is bit-reflected). Use the Copy button to copy all parameters as a single line of text. - Entry Inspector — Type any index from 0 to 255 (decimal or hex with 0x prefix) to instantly look up that table entry. For example, entering
0x01for CRC-32/ISO-HDLC showstable[0x01] = 0x77073096. The corresponding row in the table is also highlighted in the grid view. - Lookup Table / Export Script — In Table mode, all 256 entries are shown in an 8-column grid with row offsets as hexadecimal labels. In Script mode, the full array declaration is displayed ready to copy. Use the Copy button to copy the entire output to your clipboard.
Typical Workflow
- Select your CRC algorithm from the dropdown (e.g. CRC-32/ISO-HDLC for Ethernet or ZIP)
- Check the Summary panel to confirm the parameters match your specification
- Switch Output Format to Script and select your language
- Click Copy to copy the array declaration and paste it into your project
- Verify your implementation using the CRC Calculator: compute CRC of
"123456789"and compare to the Check value in the Summary
How Byte-Wise CRC Works
The standard table-driven CRC loop (reflected variant) looks like this:
crc = init
for byte in data:
crc = table[(crc ^ byte) & 0xFF] ^ (crc >> 8)
crc ^= xoroutFor non-reflected (normal) algorithms, the byte is shifted into the high end of the accumulator instead:
crc = init
for byte in data:
crc = table[((crc >> (width-8)) ^ byte) & 0xFF] ^ (crc << 8)
crc ^= xoroutThe exported Script output includes the exact array declaration for your target language, with polynomial and parameter annotations — ready to paste directly into your project.
Table Generation Method
Each of the 256 table entries is computed by treating the index as an 8-bit input byte, running it through the standard CRC bit-by-bit loop, and recording the result. For reflected algorithms the polynomial is bit-reversed before processing; for normal algorithms the input byte is positioned in the high bits of the accumulator. The output is masked to the algorithm's actual bit width.
Check Value Verification
The Summary panel shows the algorithm's check value — the CRC of the ASCII string "123456789". Use the CRC Calculator to verify your table-driven implementation produces the same result.
Storage Type Selection
- CRC-3 through CRC-8: stored in
u8/uint8_t - CRC-9 through CRC-16: stored in
u16/uint16_t - CRC-17 through CRC-32: stored in
u32/uint32_t - CRC-40 through CRC-64: stored in
u64/uint64_t
Commonly Used CRC Lookup Tables
CRC-32/ISO-HDLC (Ethernet, ZIP, gzip, PNG)
- Polynomial:
0x04C11DB7(reflected:0xEDB88320) - Init:
0xFFFFFFFF| XOR-out:0xFFFFFFFF| RefIn/RefOut: true - Check value ("123456789"):
0xCBF43926 - The first entry in the reflected table is always
0x00000000; entry [1] is0x77073096
CRC-16/MODBUS
- Polynomial:
0x8005(reflected:0xA001) - Init:
0xFFFF| XOR-out:0x0000| RefIn/RefOut: true - Check value:
0x4B37 - Widely used in Modbus RTU framing for industrial serial communication
CRC-8/MAXIM-DOW (1-Wire)
- Polynomial:
0x31(reflected:0x8C) - Init:
0x00| XOR-out:0x00| RefIn/RefOut: true - Check value:
0xA1 - Used in Dallas/Maxim 1-Wire sensors (DS18B20 temperature, DS2401 serial number)
Frequently Asked Questions
What is a CRC lookup table and why is it used?
A CRC lookup table is a precomputed array of 256 values that accelerates byte-wise CRC calculation. Instead of processing all 8 bits of each input byte individually, an implementation XORs the current byte with the CRC accumulator, uses the result as an index into the table, and combines the table value with the shifted accumulator in a single step — reducing the inner loop from 8 iterations to one table lookup.
How is the CRC-32/ISO-HDLC (Ethernet, ZIP, gzip) lookup table generated?
The table uses the reflected polynomial 0xEDB88320 (bit-reversal of 0x04C11DB7'). Each of the 256 entries is computed by treating the index as an 8-bit input, running the standard 8-step bit-wise CRC loop with the reflected polynomial. Entry [1] is 0x77073096; entry [255] is 0x2D02EF8D.
What is the byte-wise CRC loop for a reflected (RefIn=true) algorithm?
For CRC-32/ISO-HDLC, CRC-16/MODBUS, CRC-8/MAXIM-DOW and all other reflected algorithms:
crc = init
for byte in data:
crc = table[(crc ^ byte) & 0xFF] ^ (crc >> 8)
crc ^= xoroutHow does a non-reflected (RefIn=false) CRC table loop differ?
For CRC-32/MPEG-2, CRC-16/IBM-3740, CRC-8/SMBUS and other non-reflected algorithms:
crc = init
for byte in data:
crc = table[((crc >> (width-8)) ^ byte) & 0xFF] ^ (crc << 8)
crc &= mask
crc ^= xoroutWhat storage type is used for each CRC width?
- CRC-1 to CRC-8 →
u8/uint8_t - CRC-9 to CRC-16 →
u16/uint16_t - CRC-17 to CRC-32 →
u32/uint32_t - CRC-33 to CRC-64 →
u64/uint64_t
How can I verify that my CRC lookup table implementation is correct?
Every CRC algorithm has a published check value — the CRC of the ASCII string "123456789". Run your table-driven implementation on that string and compare the result to the check value shown in the Summary panel. For CRC-32/ISO-HDLC the check value is 0xCBF43926; for CRC-16/MODBUS it is 0x4B37; for CRC-8/MAXIM-DOW it is 0xA1.
What is the CRC-16/MODBUS lookup table first entry?
The CRC-16/MODBUS table uses the reflected polynomial 0xA001 (bit-reversal of 0x8005). Table entry [0] is 0x0000 and entry [1] is 0xC0C1. Init is 0xFFFF.
Which output languages are supported for CRC table export?
The Script export supports: C, C++ (std::array), Go, Java (long[]), JavaScript, Kotlin (longArrayOf), Python, Rust (const [T; 256]), Swift, and TypeScript. Each export includes a comment header with algorithm name and full parameter set.
Is data sent to a server when generating CRC lookup tables?
No. All table generation runs entirely in WebAssembly compiled from Rust, executing locally in your browser. No input, algorithm selection, or table output is transmitted to any server. Settings are saved only to your browser's localStorage.
Related Tools
- TOTP Generator - Generate RFC 6238 TOTP codes from a Base32 secret: SHA-1/SHA-256/SHA-512, 15/30/60s steps, 6 or 8 digits. otpauth:// QR for authenticator apps, verify with time drift tolerance, optional HMAC debug. Client-side only.
- JWT Encoder & Decoder - Decode JWT header and payload, verify HS256/HS384/HS512 signatures with your secret, inspect exp/iat/nbf/iss/sub/aud, and encode new JWTs from JSON—all in the browser. No upload; ideal for API auth debugging and learning RFC 7519.
- TLS Certificate Analyzer - Decode PEM or DER X.509 certificates in the browser: subject/issuer, validity, SAN, key usage, fingerprints, and chain relationships—useful for HTTPS debugging and DevOps. No upload to a backend.
- CRC Calculator - Calculate CRC checksums with 100+ algorithms for data integrity verification
- File Hash Calculator - Compute cryptographic hashes for files and text in your browser: MD5, SHA-1, SHA-256, SHA-384, SHA-512, SHA3, Blake2, and more. Drag-and-drop files, hex/base64 output, side-by-side comparison. Nothing uploaded—runs locally with Web Crypto.
Lookup Table Settings
| +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 |
|---|---|---|---|---|---|---|---|
| 00: 0x00000000 | 01: 0x77073096 | 02: 0xEE0E612C | 03: 0x990951BA | 04: 0x076DC419 | 05: 0x706AF48F | 06: 0xE963A535 | 07: 0x9E6495A3 |
| 08: 0x0EDB8832 | 09: 0x79DCB8A4 | 0A: 0xE0D5E91E | 0B: 0x97D2D988 | 0C: 0x09B64C2B | 0D: 0x7EB17CBD | 0E: 0xE7B82D07 | 0F: 0x90BF1D91 |
| 10: 0x1DB71064 | 11: 0x6AB020F2 | 12: 0xF3B97148 | 13: 0x84BE41DE | 14: 0x1ADAD47D | 15: 0x6DDDE4EB | 16: 0xF4D4B551 | 17: 0x83D385C7 |
| 18: 0x136C9856 | 19: 0x646BA8C0 | 1A: 0xFD62F97A | 1B: 0x8A65C9EC | 1C: 0x14015C4F | 1D: 0x63066CD9 | 1E: 0xFA0F3D63 | 1F: 0x8D080DF5 |
| 20: 0x3B6E20C8 | 21: 0x4C69105E | 22: 0xD56041E4 | 23: 0xA2677172 | 24: 0x3C03E4D1 | 25: 0x4B04D447 | 26: 0xD20D85FD | 27: 0xA50AB56B |
| 28: 0x35B5A8FA | 29: 0x42B2986C | 2A: 0xDBBBC9D6 | 2B: 0xACBCF940 | 2C: 0x32D86CE3 | 2D: 0x45DF5C75 | 2E: 0xDCD60DCF | 2F: 0xABD13D59 |
| 30: 0x26D930AC | 31: 0x51DE003A | 32: 0xC8D75180 | 33: 0xBFD06116 | 34: 0x21B4F4B5 | 35: 0x56B3C423 | 36: 0xCFBA9599 | 37: 0xB8BDA50F |
| 38: 0x2802B89E | 39: 0x5F058808 | 3A: 0xC60CD9B2 | 3B: 0xB10BE924 | 3C: 0x2F6F7C87 | 3D: 0x58684C11 | 3E: 0xC1611DAB | 3F: 0xB6662D3D |
| 40: 0x76DC4190 | 41: 0x01DB7106 | 42: 0x98D220BC | 43: 0xEFD5102A | 44: 0x71B18589 | 45: 0x06B6B51F | 46: 0x9FBFE4A5 | 47: 0xE8B8D433 |
| 48: 0x7807C9A2 | 49: 0x0F00F934 | 4A: 0x9609A88E | 4B: 0xE10E9818 | 4C: 0x7F6A0DBB | 4D: 0x086D3D2D | 4E: 0x91646C97 | 4F: 0xE6635C01 |
| 50: 0x6B6B51F4 | 51: 0x1C6C6162 | 52: 0x856530D8 | 53: 0xF262004E | 54: 0x6C0695ED | 55: 0x1B01A57B | 56: 0x8208F4C1 | 57: 0xF50FC457 |
| 58: 0x65B0D9C6 | 59: 0x12B7E950 | 5A: 0x8BBEB8EA | 5B: 0xFCB9887C | 5C: 0x62DD1DDF | 5D: 0x15DA2D49 | 5E: 0x8CD37CF3 | 5F: 0xFBD44C65 |
| 60: 0x4DB26158 | 61: 0x3AB551CE | 62: 0xA3BC0074 | 63: 0xD4BB30E2 | 64: 0x4ADFA541 | 65: 0x3DD895D7 | 66: 0xA4D1C46D | 67: 0xD3D6F4FB |
| 68: 0x4369E96A | 69: 0x346ED9FC | 6A: 0xAD678846 | 6B: 0xDA60B8D0 | 6C: 0x44042D73 | 6D: 0x33031DE5 | 6E: 0xAA0A4C5F | 6F: 0xDD0D7CC9 |
| 70: 0x5005713C | 71: 0x270241AA | 72: 0xBE0B1010 | 73: 0xC90C2086 | 74: 0x5768B525 | 75: 0x206F85B3 | 76: 0xB966D409 | 77: 0xCE61E49F |
| 78: 0x5EDEF90E | 79: 0x29D9C998 | 7A: 0xB0D09822 | 7B: 0xC7D7A8B4 | 7C: 0x59B33D17 | 7D: 0x2EB40D81 | 7E: 0xB7BD5C3B | 7F: 0xC0BA6CAD |
| 80: 0xEDB88320 | 81: 0x9ABFB3B6 | 82: 0x03B6E20C | 83: 0x74B1D29A | 84: 0xEAD54739 | 85: 0x9DD277AF | 86: 0x04DB2615 | 87: 0x73DC1683 |
| 88: 0xE3630B12 | 89: 0x94643B84 | 8A: 0x0D6D6A3E | 8B: 0x7A6A5AA8 | 8C: 0xE40ECF0B | 8D: 0x9309FF9D | 8E: 0x0A00AE27 | 8F: 0x7D079EB1 |
| 90: 0xF00F9344 | 91: 0x8708A3D2 | 92: 0x1E01F268 | 93: 0x6906C2FE | 94: 0xF762575D | 95: 0x806567CB | 96: 0x196C3671 | 97: 0x6E6B06E7 |
| 98: 0xFED41B76 | 99: 0x89D32BE0 | 9A: 0x10DA7A5A | 9B: 0x67DD4ACC | 9C: 0xF9B9DF6F | 9D: 0x8EBEEFF9 | 9E: 0x17B7BE43 | 9F: 0x60B08ED5 |
| A0: 0xD6D6A3E8 | A1: 0xA1D1937E | A2: 0x38D8C2C4 | A3: 0x4FDFF252 | A4: 0xD1BB67F1 | A5: 0xA6BC5767 | A6: 0x3FB506DD | A7: 0x48B2364B |
| A8: 0xD80D2BDA | A9: 0xAF0A1B4C | AA: 0x36034AF6 | AB: 0x41047A60 | AC: 0xDF60EFC3 | AD: 0xA867DF55 | AE: 0x316E8EEF | AF: 0x4669BE79 |
| B0: 0xCB61B38C | B1: 0xBC66831A | B2: 0x256FD2A0 | B3: 0x5268E236 | B4: 0xCC0C7795 | B5: 0xBB0B4703 | B6: 0x220216B9 | B7: 0x5505262F |
| B8: 0xC5BA3BBE | B9: 0xB2BD0B28 | BA: 0x2BB45A92 | BB: 0x5CB36A04 | BC: 0xC2D7FFA7 | BD: 0xB5D0CF31 | BE: 0x2CD99E8B | BF: 0x5BDEAE1D |
| C0: 0x9B64C2B0 | C1: 0xEC63F226 | C2: 0x756AA39C | C3: 0x026D930A | C4: 0x9C0906A9 | C5: 0xEB0E363F | C6: 0x72076785 | C7: 0x05005713 |
| C8: 0x95BF4A82 | C9: 0xE2B87A14 | CA: 0x7BB12BAE | CB: 0x0CB61B38 | CC: 0x92D28E9B | CD: 0xE5D5BE0D | CE: 0x7CDCEFB7 | CF: 0x0BDBDF21 |
| D0: 0x86D3D2D4 | D1: 0xF1D4E242 | D2: 0x68DDB3F8 | D3: 0x1FDA836E | D4: 0x81BE16CD | D5: 0xF6B9265B | D6: 0x6FB077E1 | D7: 0x18B74777 |
| D8: 0x88085AE6 | D9: 0xFF0F6A70 | DA: 0x66063BCA | DB: 0x11010B5C | DC: 0x8F659EFF | DD: 0xF862AE69 | DE: 0x616BFFD3 | DF: 0x166CCF45 |
| E0: 0xA00AE278 | E1: 0xD70DD2EE | E2: 0x4E048354 | E3: 0x3903B3C2 | E4: 0xA7672661 | E5: 0xD06016F7 | E6: 0x4969474D | E7: 0x3E6E77DB |
| E8: 0xAED16A4A | E9: 0xD9D65ADC | EA: 0x40DF0B66 | EB: 0x37D83BF0 | EC: 0xA9BCAE53 | ED: 0xDEBB9EC5 | EE: 0x47B2CF7F | EF: 0x30B5FFE9 |
| F0: 0xBDBDF21C | F1: 0xCABAC28A | F2: 0x53B39330 | F3: 0x24B4A3A6 | F4: 0xBAD03605 | F5: 0xCDD70693 | F6: 0x54DE5729 | F7: 0x23D967BF |
| F8: 0xB3667A2E | F9: 0xC4614AB8 | FA: 0x5D681B02 | FB: 0x2A6F2B94 | FC: 0xB40BBE37 | FD: 0xC30C8EA1 | FE: 0x5A05DF1B | FF: 0x2D02EF8D |