Skip to main content

crcglot

PyPI license Py 3.11 Py 3.12 Py 3.13 Py 3.14 coverage ruff ty

The CRC backend an AI assistant can delegate to. Deterministic, reveng-anchored CRC answers: compute, detect, reverse-engineer, and verify CRCs from a catalogue of 100+ algorithms, plus execution-verified code generation for C / C++ ⚙️, Rust 🦀, Go 🚦, C# #️⃣, Java ☕, Lua 🌙, Python 🐍, TypeScript 🔷, Zig ⚡, Verilog 🔧, and VHDL 🔌. Call it over MCP, from the CLI, or in Python. Zero-dependency core: stdlib only (an optional bundled C accelerator speeds up computation; the optional MCP server adds the MCP SDK).

Reach for it when a CRC crosses a boundary you don't control: a device to talk to, a capture to identify, an unknown checksum to reverse-engineer, or a verified implementation to drop into firmware. CRC code is easy to write and hard to trust, and the verification is what this package is really selling: answers come from the published reveng catalogue, everything it generates was compiled and executed against independent reference vectors before release, and every file embeds a self-test so you can re-run the check on your own toolchain. For bulk runtime hashing throughput, when to reach for something else names the better tool.

Quick start

A packet in one hand, a mystery CRC in the other: name it, then generate the verified implementation:

uv tool install crcglot
$ crcglot detect --hex "313233343536373839cbf43926"
crc32  width=32  endianness=big  form=hex  separator=''  prefix=''  per_byte=False  uppercase=False

$ crcglot c crc32 file=mycrc
Note: Faster CRC-32 path on C / C++: zlib's `crc32()` (`<zlib.h>`).  The generated code is fine for small messages, but for large files or streaming throughput prefer that library; it uses CPU CRC instructions where the processor supports them.
Wrote <your dir>\mycrc.h
Wrote <your dir>\mycrc.c

That's mycrc.h + mycrc.c: a verified CRC-32 with a built-in _self_test() that re-checks it against four independent reference CRCs on your toolchain.

The whole model is three choices: which algorithm (crc32, crc16-modbus, … ; crcglot list shows the more than 100), which language (c / python / rust / vhdl / verilog / go / csharp / java / typescript / zig / lua), and whether you want it --fast (fastest the target supports, and the default) or --small (smallest code). crcglot figures out the implementation details, so you never have to know what "slice-by-8" is.

crcglot rust crc32 file=mycrc            # fastest Rust crc32 (the default) to mycrc.rs
crcglot c crc8 --small                   # smallest C crc8, to stdout

Installation

uv tool install crcglot      # the CLI on PATH
uv add crcglot               # as a library in your project

Python 3.11+, zero runtime dependencies: crcglot imports nothing beyond the standard library. (The prebuilt wheels bundle an optional C accelerator for runtime CRC computation, covered in docs/api.md, so the package is not "pure Python" in the packaging sense, but it runs fully, on any platform, without it.) Per-target toolchains (gcc, rustc, tsx, iverilog, etc.) only matter if you want to run the generated code; the generator produces source either way.

What you get per language

Function Purpose
<fname>_init / _update / _finalize Streaming triple; feed data chunk by chunk
<fname> One-shot wrapper that calls the streaming triple
<fname>_self_test Verify against embedded reference CRCs on your toolchain (what each target checks: docs/generated-code.md)

Every target ships a runtime-callable _self_test(): C returns 0/1; Rust / Go / C# / Java / Lua / TypeScript / Zig / Python / Verilog / VHDL return bool / boolean / bit. No #[cfg(test)] gating, so you can call it from your release build, a boot self-check, or a startup assertion. Zig additionally emits a native test declaration, so zig test <file>.zig verifies the module with no harness. The generated files are also documented (per-language doc-tool styles) and named in each target's idiomatic casing; see docs/generated-code.md.

The generated Python is pure Python: portable and dependency-free, but interpreted, so it is the slow path. Generate the .py to port a CRC into a zero-dependency codebase; to compute fast in Python, call crcglot's own runtime instead (below).

How it's verified

The guarantee is behavioral, not structural. crcglot doesn't lint the generated code, it runs it: every one of the more than 100 algorithms, in every variant a target supports, in every one of the eleven languages, is generated, run through its real toolchain (gcc, rustc, go, dotnet, javac, tsx, zig, lua, iverilog, ghdl), and executed against reference vectors computed by two engines that are not ours. Ten categories of evidence make up the verification matrix, from reference vectors through adversarial review, and all of it is yours to re-run. docs/verification/index.md explains the review model and maps every category to the tests that carry it.

Every generated file also embeds a _self_test() over independent reference vectors. Call it once in your build environment (a unit test, a startup assertion, a boot check): CI compiles and runs the generated code through every target toolchain on Linux for each change, releases are re-verified across the full toolchain set on a Windows reference box, and only running the self-test on yours confirms your compiler, flags, endianness, and integer widths agree. What it checks, where its expected values come from, and what it buys you beyond correctness (a boot-time integrity check, auditability, a cleaner story for regulated builds) are in docs/generated-code.md.

Use it with Claude (and any MCP client)

crcglot[mcp] exposes the toolkit as a Model Context Protocol server, so an assistant (Claude Desktop, Claude Code, Cursor, mcp-cli, …) does the judgment (which tool, which parameters, what the result means) while crcglot does the arithmetic. The hardest case, recovering an unknown custom CRC from captured frames, is worked end to end as a real chat session in docs/MCP.md.

uv tool install 'crcglot[mcp]'    # the extra ships the MCP SDK

Then wire it in. Claude Code, one command:

claude mcp add crcglot -- uvx --from 'crcglot[mcp]' crcglot-mcp

Claude Desktop (and other clients), via claude_desktop_config.json:

{
  "mcpServers": {
    "crcglot": {
      "command": "uvx",
      "args": ["--from", "crcglot[mcp]", "crcglot-mcp"]
    }
  }
}

Tools: crc_list · crc_info · crc_self_test_vectors · crc_detect · crc_reverse · crc_identify_trailer · crc_verify · crc_encode · crc_compute · crc_compute_many · crc_generate · crc_credits. Resources: crcglot://catalogue.json · crcglot://languages.json · crcglot://variants.json · crcglot://verbs.json. Full reference and setup walkthrough live in docs/MCP.md.

CLI at a glance

Subcommand What it does
crcglot list [GLOB] Browse the catalogue (more than 100 algorithms)
crcglot info <name> Full Rocksoft/Williams parameters for one algorithm
crcglot detect Name the catalogue CRC ending a packet (file, hex, text, or a crclink JSON frame)
crcglot identify Name a non-CRC trailer: checksum (sum/LRC/XOR/Fletcher/Adler) or digest (MD5/SHA/BLAKE2, full or truncated); notes a likely MAC when nothing matches
crcglot reverse Recover the parameters of an unknown / custom CRC; prints ready-to-paste --custom tokens
crcglot verify Check a frame's trailing CRC against a named algorithm
crcglot encode Build a packet by appending the CRC (round-trip partner to detect)
crcglot compute The raw CRC integer of some data
crcglot c | rust | go | … Generate verified source for that language (--fast default, --small, --custom, bundling, --comment, --naming)
crcglot credits Acknowledgments for the work crcglot builds on
crcglot version Installed crcglot version (the same string stamped into generated code)

Every option, token, and example lives in docs/cli.md.

Catalogue

More than 100 algorithms covering everything from CRC-8 (ATM, AUTOSAR, Bluetooth, Maxim 1-Wire) through CRC-16 (Modbus, XMODEM, CCITT, IBM SDLC) through CRC-32 (Ethernet, bzip2, iSCSI, AUTOSAR) to CRC-64 (XZ, ECMA-182, NVMe, Redis), plus the non-byte-aligned families: CAN (CRC-15), CAN FD (CRC-17/21), FlexRay (CRC-11/24), LTE/BLE/OpenPGP (CRC-24), and the GSM/UMTS/CDMA2000 telecom set. Browse with crcglot list.

Programmatic API

Everything the CLI does is callable from Python, behind two typed registries. import crcglot loads only the compute core (4 modules, ~30 ms); the rest loads on first use.

from crcglot import LANGUAGES, ALGORITHMS

header, source = LANGUAGES["c"].generator("crc32")     # generate
modbus = ALGORITHMS["crc16-modbus"]                    # introspect
print(modbus.width, hex(modbus.check), modbus.desc)
# → 16 0x4b37 Modbus RTU serial protocol

LanguageInfo carries everything a UI or build script needs per target (extensions, variants, generators, naming/casing helpers); AlgorithmInfo is the full parameter set; VERBS is the verb manifest, every verb's parameters and choices as plain data for frontends that render typed tools, with call_verb(name, **params) as their uniform invoker. Custom polynomials plug into the same generators via generator_from_entry. The full API is in docs/api.md.

Pointing an LLM or coding agent at crcglot? Start with llms.txt: a concise, linked map of what the package does and where to look, to load first instead of crawling the source.

Fast runtime CRC (optional C extension)

Beyond generating code, crcglot computes CRCs at runtime. With the bundled C extension, any of the more than 100 CRCs runs from Python at compiled-C-class throughput on bulk data (~1.7 GB/s on a 1 MiB buffer), and IEEE CRC-32 / JAMCRC ride the stdlib's hardware path (tens of GB/s); the pure-Python fallback always works, far more slowly. generic_crc(data, crc) picks the fastest path available, with no variant knob. Streaming (crc_stream) and batch (generic_crc_many) APIs, the hot-loop warning, and the dispatch details are in docs/api.md; measured figures are in BENCHMARKS.md.

Example output and benchmarks

  • EXAMPLES.md: the actual generated source for crc32 across every language × variant combination; every block reproducible with one CLI command.
  • BENCHMARKS.md: measured throughput for every (language × variant) cell, plus the runtime engine's paths.

When to reach for something else

crcglot tries to be the whole toolbox for CRC problems, not the best tool for every CRC-adjacent job. Two pointers:

  • Bulk runtime hashing of non-CRC-32 algorithms: anycrc computes any ≤64-bit CRC via hardware carry-less multiplication at ~10× crcglot's C-extension throughput on large in-memory buffers. If your workload is "checksum gigabytes that are already in RAM with crc16," use it. (For IEEE CRC-32 crcglot already rides the stdlib's hardware path, and for small framed messages its batch API is the faster of the two. Behind real file I/O the difference mostly disappears; see BENCHMARKS.md.) crcglot uses anycrc itself, as one of the two independent engines that generate its reference vectors.
  • Deep reverse-engineering of pathological captures: reveng (the C tool) has decades of accumulated handling for obscure reversal cases. crcglot's reverse() / crc_reverse covers the common paths (catalogue identification plus algebraic recovery of custom parameters), but if it comes up empty on a gnarly capture, reveng is the reference instrument, and its catalogue is the source crcglot's own algorithm data derives from.

Acknowledgments

crcglot builds on:

  • The reveng CRC catalogue by Greg Cook: the canonical source of CRC algorithm parameters since 1999, and the source of the more than 100 parameter sets, descriptions, and check values every catalogue entry in crcglot is derived from.
  • zlib by Mark Adler, Jean-loup Gailly et al.: the runtime fast path for CRC-32/ISO-HDLC and JAMCRC, which take the PCLMULQDQ folding path on x86 and the PMULL / crc32 instructions on ARM.
  • The Rocksoft Model CRC parameterization by Ross N. Williams: the (width, poly, init, refin, refout, xorout, check) vocabulary every catalogue entry is expressed in.

crcglot credits prints this same content in the terminal, and crcglot.ATTRIBUTION / crcglot.ACKNOWLEDGMENTS expose it programmatically.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crcglot-0.30.0.tar.gz (397.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

crcglot-0.30.0-cp311-abi3-win_arm64.whl (257.6 kB view details)

Uploaded CPython 3.11+Windows ARM64

crcglot-0.30.0-cp311-abi3-win_amd64.whl (258.6 kB view details)

Uploaded CPython 3.11+Windows x86-64

crcglot-0.30.0-cp311-abi3-musllinux_1_2_x86_64.whl (274.0 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ x86-64

crcglot-0.30.0-cp311-abi3-musllinux_1_2_aarch64.whl (273.8 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

crcglot-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (273.5 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

crcglot-0.30.0-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (273.9 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

crcglot-0.30.0-cp311-abi3-macosx_11_0_arm64.whl (255.2 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

Details for the file crcglot-0.30.0.tar.gz.

File metadata

  • Download URL: crcglot-0.30.0.tar.gz
  • Upload date:
  • Size: 397.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for crcglot-0.30.0.tar.gz
Algorithm Hash digest
SHA256 19fc1e068177d734e3b25dffbfd92f59f3eca0835f002ee7de4be3de7a738f6b
MD5 2b4bb112f80a56b88898d094b4858715
BLAKE2b-256 809603a278f43b67d1954ae4eacc55728a9cdfb2843daf66aa492cec89b8a85e

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0.tar.gz:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crcglot-0.30.0-cp311-abi3-win_arm64.whl.

File metadata

  • Download URL: crcglot-0.30.0-cp311-abi3-win_arm64.whl
  • Upload date:
  • Size: 257.6 kB
  • Tags: CPython 3.11+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for crcglot-0.30.0-cp311-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 cab755359fb3e5b2f93df647f2d0d351ed0d3c3c582a7c6cb4782f0418665e79
MD5 2b73e69747225e6067c3cfd679e69c2f
BLAKE2b-256 4bf785ae6a4b24e0f0c138515d37e6dfc1028879a54fd1408940e378af92b722

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0-cp311-abi3-win_arm64.whl:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crcglot-0.30.0-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: crcglot-0.30.0-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 258.6 kB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for crcglot-0.30.0-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 aa0c99d05a3885f79235c08fab94d2f9b019384d1395a136c2b3af2ef1e452c9
MD5 c7cbebc1e191210bcb34c631d2e1bfb7
BLAKE2b-256 c3fac76be7380e3093087e58f368149fef551a41953285bd9a983d5c776d52ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0-cp311-abi3-win_amd64.whl:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crcglot-0.30.0-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for crcglot-0.30.0-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c768b481f48afdbd49bcb9d13b4260b87e61a400e4c0d320e1cfd3906d8ff3ef
MD5 cffae520332d2c40aeb5f0af9ef502a2
BLAKE2b-256 f9c39312e8d8673007ad3e44e50887a04e09c4ea538d04fad019649086dd17cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0-cp311-abi3-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crcglot-0.30.0-cp311-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for crcglot-0.30.0-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8f7c3c936a5ffc65629d6cbd0be3b8f911d9fd0d1ae7a926220a174b58bff7f9
MD5 dbb21a022a8e0dc0dec299f00c6baf76
BLAKE2b-256 6103ca9d13b9c6fa4a6d88e9b92dbbb29d94b9659c6d7469225014df0ddb9f54

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0-cp311-abi3-musllinux_1_2_aarch64.whl:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crcglot-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for crcglot-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8771d03a0ec9b9fe4d25f2cae49c4f5c9257b8bc9a502c25bf0301ba46e44873
MD5 cdaca7cd9566fea5ed9a8758b0021b32
BLAKE2b-256 7315139357bcf7f1106d84ef3f847505c8408981c9c933f7920bd497683c1235

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crcglot-0.30.0-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crcglot-0.30.0-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e34a74f059357be843a38b586fc699105e812ace8a81214ce83b74ffb64fbcdf
MD5 b1f11652b93398f95187d62b1f7c50ee
BLAKE2b-256 bb90ba3f46a03573cbf5059e618adb120d79f54e4470fce974761d9678f8798c

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crcglot-0.30.0-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crcglot-0.30.0-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 61a8d5a1ef1a7b54276841fbab642088afdbdcde6a4853bbc62c18a546228942
MD5 c168f1bba504382b5180e0d615a144df
BLAKE2b-256 c9a36b0d39ca351f8c62b5123aa9d9eb2bcd2e84aa86b42a82fa1c8a9303b560

See more details on using hashes here.

Provenance

The following attestation bundles were made for crcglot-0.30.0-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: wheels.yml on hucker/crcglot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page