This module is used to calculate CRC (Cyclic Redundancy Check) values for binary data. It uses NIF functions written in C to iterate over the given binary calculating the CRC checksum value. The NIFs are written to report their time slice usage and will not interfere with the schedulers.
Add :crc to your list of dependencies in mix.exs:
defdepsdo[{:crc,"~> 0.10"}]endAdd crc to your rebar.config:
{deps, [
{crc, "0.10.6"}
]}.Or erlang.mk:
dep_crc=hex0.10.6Run CRC.list/0 to get a full list of all pre-defined models or CRC.list/1 with a filter to search for a pre-defined model.
To calculate a CRC-16 X-Modem checksum for the binary <<1,2,3,4,5,4,3,2,1>> using the pre-defined model:
iex>CRC.crc(:crc_16_xmodem,<<1,2,3,4,5,4,3,2,1>>)31763iex>CRC.calculate(<<1,2,3,4,5,4,3,2,1>>,:crc_16_xmodem)31763Or you can create a model at runtime, this can be done with a map:
iex>CRC.crc(%{width: 16,poly: 0x1021,init: 0x00,refin: false,refout: false,xorout: 0x00},<<1,2,3,4,5,4,3,2,1>>)31763iex>CRC.calculate(<<1,2,3,4,5,4,3,2,1>>,%{width: 16,poly: 0x1021,init: 0x00,refin: false,refout: false,xorout: 0x00})31763Or you can extend one of the pre-defined models:
iex>CRC.crc(%{extend: :crc_16_xmodem,init: 0x00,},<<1,2,3,4,5,4,3,2,1>>)31763CRC.crc_init/1 is used to create a resource and be used to do partial updates to a calculation that is then finalized later:
iex>resource=CRC.crc_init(:crc_16_xmodem)#Reference<x.x.x.x>iex>resource2=CRC.crc_update(resource,<<1,2,3,4,5>>)#Reference<y.y.y.y>iex>resource3=CRC.crc_update(resource2,<<4,3,2,1>>)#Reference<z.z.z.z>iex>CRC.crc_final(resource3)31763This could be useful to calculate a CRC for a larger binary that you are receiving asynchronously.
CRC implementations have been tested against these online calculators to validate their correctness to the best of our ability.
- https://www.lammertbies.nl/comm/info/crc-calculation.html
- http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
There are also two property tests that can use PyCRC or CRC RevEng if installed and configured locally.
$ export PYCRC_BIN=~/pycrc-0.9.1/pycrc.py
$ export REVENG_BIN=~/reveng-1.5.2/reveng
$ mix testPyCRC is used as a part of the TravisCI test suite.
Copyright (c) 2026 Rodney Norris
CRC is released under the MIT License. See the LICENSE.md file for further details.