Skip to main content

Library for calculating CRC3/CRC4/CRC8/CRC16/CRC24/CRC32/CRC64/CRC82

Project description

libscrc is a library for calculating CRC3 CRC4 CRC5 CRC6 CRC7 CRC8 CRC16 CRC24 CRC32 CRC64 CRC82.

CRCx

CRC8

CRC16

CRC24

CRC32

CRC64

CRC3-GSM

INTEL

MODBUS

BLE

FSC

GO-ISO

CRC3-ROHC

BCC

IBM

OPENPGP

CRC32

ECMA182

CRC4-ITU

LRC

XMODEM

LTE-A

MPEG2

WE

CRC5-ITU

MAXIM8

CCITT

LTE-B

ADLER32

XZ64

CRC5-EPC

ROHC

KERMIT

OS9

FLETCHER32

CRC5-USB

ITU8

MCRF4XX

FLEXRAY-A

POSIX

CRC6-ITU

CRC8

SICK

FLEXRAY-B

BZIP2

CRC6-GSM

SUM8

DNP

INTERLAKEN

JAMCRC

CRC6-DARC

FLETCHER8

X25

CRC24

AUTOSAR

CRC7

SMBUS

USB

C / ISCSI

CRC7-MMC

AUTOSAR

MAXIM16

D/BASE91-D

CRC7-UMTS

LTE

DECT(R/X)

Q / AIXM

CRC7-ROHC

SAE-J1850

TCP/UDP

XFER

I-CODE

CDMA2000

CKSUM

CAN15

GSM-A

FLETCHER16

XZ32

CAN17

NRSC-5

EPC16

AAL5

CAN21

WCDMA

PROFIBUS

ISO-HDLC

BLUETOOTH

BUYPASS

PKZIP

CRC10-ATM

DVB-S2

GENIBUS

ADCCP

CRC13-BBC

EBU

GSM16

V-42

MPT1327

DARC

RIELLO

STM32

CDMA2000

MIFARE

OPENSAFETY

ECMXF

LIN1.3

EN13757

LIN2.x

CMS

CRC30-CDMA

ID8

PHILIPS

DARC82

NMEA

MODBUS-ASC

Installation

  • Compile and install the library:

    pip3 install libscrc

    or:

    python3 setup.py build
    python3 setup.py install

    You will need the administrative privileges to execute the last command.

  • Cross compile and install the library:

    # vim setup.cfg
    universal=1
    plat-name=linux_armv7l
    
    export CROSS_COMPILE=arm-linux-gnueabihf-
    export CC='${CROSS_COMPILE}gcc -pthread'
    export LDSHARED='${CROSS_COMPILE}gcc -shared'
    export CFLAGS='-I/usr/include/python3.5m -I/usr/include/'
    
    python3 setup.py build
    # gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11)
  • After installation you can run unit tests to make sure that the library works fine. Execute:

    # python3 -m libscrc.test.modbus
    # python3 -m libscrc.test.crc8
    # python3 -m libscrc.test.crcx
    # python3 -m libscrc.test.canx
    # python3 -m libscrc.test.crc16
    # python3 -m libscrc.test.crc24
    # python3 -m libscrc.test.crc32
    # python3 -m libscrc.test.crc64

Usage

In Python 3:

import libscrc
crc16 = libscrc.modbus(b'1234')       # Calculate ASCII of modbus(rtu)
crc16 = libscrc.modbus(b'\x01\x02')   # Calculate HEX of modbus(rtu)
crc16 = libscrc.modbus(bytearray( [ 0x01, 0x02 ] ))

You can also calculate CRC gradually( v1.4+ ):

import libscrc
crc16 = libscrc.xmodem(b'1234')
crc16 = libscrc.xmodem(b'5678', crc16)

Example

  • CRCx::

    crc3 = libscrc.gsm3(b’1234’) crc3 = libscrc.rohc3(b’1234’) crc4 = libscrc.itu4(b’1234’) crc4 = libscrc.g_704(b’1234’) crc4 = libscrc.interlaken4(b’1234’) crc5 = libscrc.itu5(b’1234’) crc5 = libscrc.epc(b’1234’) crc5 = libscrc.usb5(b’1234’) crc6 = libscrc.itu6(b’1234’) crc6 = libscrc.darc6(b’1234’) crc7 = libscrc.mmc(b’1234’) crc7 = libscrc.crc7(b’1234’) crc7 = libscrc.umts7(b’1234’) crc7 = libscrc.rohc7(b’1234’)

    crc10 = libscrc.atm10(b’1234’) crc10 = libscrc.gsm10(b’1234’) crc10 = libscrc.crc10_cdma2000(b’1234’) crc11 = libscrc.umts11(b’1234’) crc11 = libscrc.flexray11(b’1234’) crc12 = libscrc.umts12(b’1234’) crc12 = libscrc.crc12_3gpp(b’1234’) crc12 = libscrc.dect12(b’1234’) crc12 = libscrc.crc12(b’1234’) crc12 = libscrc.gsm12(b’1234’) crc12 = libscrc.crc12_cdma2000(b’1234’) crc13 = libscrc.bbc13(b’1234’) crc14 = libscrc.darc14(b’1234’) crc15 = libscrc.mpt1327(b’1234’)

    crc15 = libscrc.can15(b’1234’) crc17 = libscrc.can17(b’1234’) crc21 = libscrc.can21(b’1234’)

    crc30 = libscrc.cdma(b’1234’) crc31 = libscrc.philips(b’1234’)

    crc40 = libscrc.gsm40(b’1234’)

    crc82 = libscrc.darc82(b’1234’)

  • CRC8::

    crc8 = libscrc.intel(b’1234’) crc8 = libscrc.bcc(b’1234’) crc8 = libscrc.lrc(b’1234’) crc8 = libscrc.maxim8(b’1234’) crc8 = libscrc.rohc(b’1234’) crc8 = libscrc.itu8(b’1234’) crc8 = libscrc.crc8(b’1234’) crc8 = libscrc.smbus(b’1234’) crc8 = libscrc.autosar8(b’1234’) crc8 = libscrc.lte8(b’1234’) crc8 = libscrc.sae_j1850(b’1234’) crc8 = libscrc.icode8(b’1234’) crc8 = libscrc.gsm8_a(b’1234’) crc8 = libscrc.nrsc_5(b’1234’) crc8 = libscrc.wcdma8(b’1234’) crc8 = libscrc.bluetooth(b’1234’) crc8 = libscrc.dvb_s2(b’1234’) crc8 = libscrc.ebu8(b’1234’) crc8 = libscrc.darc8(b’1234’) crc8 = libscrc.opensafety8(b’1234’) crc8 = libscrc.i432_1(b’1234’) crc8 = libscrc.mifare_mad(b’1234’) crc8 = libscrc.tech_3250(b’1234’) crc8 = libscrc.aes8(b’1234’) crc8 = libscrc.lin(bytes([0x15, 0x5B, 0x67])) crc8 = libscrc.lin2x(bytes([0x15, 0x5B, 0x67, 0x72, 0xAF, 0x5B]))

    crc8 = libscrc.id8(b’21020020210229117’) # ID check code of China crc8 = libscrc.nmea(b’$PFEC,GPint,RMC06*’) # National Marine Electronics Association crc8 = libscrc.modbus_asc(b’010300010001’) # Modbus(ASCII) checksum. return value is bytes (b’FA’)

  • CRC16::

    crc16 = libscrc.ibm(b’1234’) # poly=0xA001 (default Reversed) crc16 = libscrc.ibm(b’1234’, 0x8005) # poly=0x8005 (Normal) crc16 = libscrc.modbus(b’1234’) # Modbus(RTU) checksum crc16 = libscrc.xmodem(b’1234’) crc16 = libscrc.zmodem(b’1234’) crc16 = libscrc.ccitt(b’1234’) crc16 = libscrc.ccitt_aug(b’1234’) crc16 = libscrc.ccitt_true(b’1234’) crc16 = libscrc.ccitt_false(b’1234’) crc16 = libscrc.kermit(b’1234’) crc16 = libscrc.mcrf4xx(b’1234’) crc16 = libscrc.sick(b’1234’) crc16 = libscrc.dnp(b’1234’) crc16 = libscrc.x25(b’1234’) crc16 = libscrc.usb16(b’1234’) crc16 = libscrc.maxim16(b’1234’) crc16 = libscrc.dect_r(b’1234’) crc16 = libscrc.dect_x(b’1234’)

    data = b’x45x00x00x3cx00x00x00x00x40x11x00x00xc0xa8x2bxc3x08x08x08x08x11’ crc16 = libscrc.tcp( data ) # 13933 crc16 = libscrc.udp( data ) # 13933

    crc16 = libscrc.epc16(b’1234’) # RFID EPC(CRC16-PC-EPC) crc16 = libscrc.profibus(b’1234’) crc16 = libscrc.buypass(b’1234’) crc16 = libscrc.genibus(b’1234’) crc16 = libscrc.gsm16(b’1234’) crc16 = libscrc.riello(b’1234’)

    crc16 = libscrc.crc16_a(b’1234’) crc16 = libscrc.cdma2000(b’1234’) crc16 = libscrc.teledisk(b’1234’) crc16 = libscrc.tms37157(b’1234’) crc16 = libscrc.en13757(b’1234’) crc16 = libscrc.t10_dif(b’1234’) crc16 = libscrc.dds_110(b’1234’) crc16 = libscrc.lj1200(b’1234’) crc16 = libscrc.opensafety_a(b’1234’) crc16 = libscrc.opensafety_b(b’1234’)

    crc16 = libscrc.arc(b’1234’) crc16 = libscrc.lha(b’1234’) crc16 = libscrc.cms(b’1234’) crc16 = libscrc.darc(b’1234’) crc16 = libscrc.epc_c1g2(b’1234’) crc16 = libscrc.icode16(b’1234’) crc16 = libscrc.ibm_3740(b’1234’) crc16 = libscrc.autosar16(b’1234’) crc16 = libscrc.ibm_sdlc(b’1234’) crc16 = libscrc.iso_hdlc16(b’1234’) crc16 = libscrc.iec14443_3_b(b’1234’) crc16 = libscrc.iec14443_3_a(b’1234’) crc16 = libscrc.v41_lsb(b’1234’) crc16 = libscrc.v41_msb(b’1234’) crc16 = libscrc.spi_fujitsu(b’1234’) crc16 = libscrc.umts(b’1234’) crc16 = libscrc.verifone(b’1234’) crc16 = libscrc.acorn(b’1234’) crc16 = libscrc.lte16(b’1234’) crc16 = libscrc.nrsc5(b’1234’)

  • CRC24::

    crc24 = libscrc.ble(b’1234’) crc24 = libscrc.flexraya(b’1234’) crc24 = libscrc.flexrayb(b’1234’) crc24 = libscrc.openpgp(b’1234’) crc24 = libscrc.lte_a(b’1234’) crc24 = libscrc.lte_b(b’1234’) crc24 = libscrc.os9(b’1234’) crc24 = libscrc.interlaken(b’1234’) crc24 = libscrc.crc24(b’1234’)

  • CRC32::

    crc32 = libscrc.fsc(b’1234’) # Ethernet frame sequence (FSC) crc32 = libscrc.mpeg2(b’1234’) # MPEG2 crc32 = libscrc.crc32(b’1234’) # WinRAR, File crc32 = libscrc.posix(b’1234’) crc32 = libscrc.bzip2(b’1234’) crc32 = libscrc.jamcrc(b’1234’) crc32 = libscrc.autosar(b’1234’) crc32 = libscrc.crc32_c(b’1234’) crc32 = libscrc.crc32_d(b’1234’) crc32 = libscrc.crc32_q(b’1234’) crc32 = libscrc.xfer(b’1234’) crc32 = libscrc.aixm(b’1234’) crc32 = libscrc.base91_d(b’1234’) crc32 = libscrc.cksum(b’1234’) crc32 = libscrc.base91_c(b’1234’) crc32 = libscrc.iscsi(b’1234’) crc32 = libscrc.iso_hdlc(b’1234’) crc32 = libscrc.xz32(b’1234’) crc32 = libscrc.pkzip(b’1234’) crc32 = libscrc.adccp(b’1234’) crc32 = libscrc.v_42(b’1234’) crc32 = libscrc.aal5(b’1234’) crc32 = libscrc.stm32(b’1234’) # STM32 hardware calculate CRC32 crc32 = libscrc.ecmxf(b’1234’) # ECMXF

  • CRC64::

    crc64 = libscrc.iso(b’1234’) crc64 = libscrc.ecma182(b’1234’) crc64 = libscrc.we(b’1234’) crc64 = libscrc.xz64(b’1234’)

  • CRC82::

    crc82 = libscrc.darc82(b’123456789’)

NOTICE

  • Revert gradually calculating function v1.4+ (2020-08-04)

V1.8.1(2022-08-18)

  • PyArg_ParseTuple() and formats which use # require the PY_SSIZE_T_CLEAN macro since python 3.10

V1.8(2022-03-04)

  • New add modbus (ASCII) LRC checksum.

  • CRC8 -> libscrc.modbus_asc()

V1.7(2021-06-07)

  • New add CRC8 -> libscrc.id8() and libscrc.nmea()

  • Update gradually calculate functions ( CRCx -> libscrc.umts12() libscrc.crc12_3gpp() )

  • Fixed Issues #8

V1.6(2021-01-18)

  • New add CRC32 -> libscrc.stm32()

  • New add CRC8 -> libscrc.lin() and libscrc.lin2x()

V1.4 (2020-08-04)

  • Revert gradually calculating function. ( Fixed Issues #4 )

  • Optimized code

  • Gradually calculate invalid functions( TODO )

  • CRCx -> libscrc.umts12() libscrc.crc12_3gpp()

  • CRC8 -> libscrc.intel() libscrc.lrc()

  • CRC16 -> libscrc.sick() libscrc.udp() libscrc.tcp() libscrc.fletcher16()

  • CRC32 -> libscrc.fletcher32()

V1.0 (2020-03-23)

  • New hacker8 hacker16 hacker32 hacker64

  • New FLETCHER8 FLETCHER16 FLETCHER32

V0.1.5 (2017-09-22)

  • New CRC4-ITU Poly = 0x03 Initial = 0x00 Xorout=0x00 Refin=True Refout=True

  • New CRC5-ITU Poly = 0x15 Initial = 0x00 Xorout=0x00 Refin=True Refout=True

  • New CRC5-EPC Poly = 0x09 Initial = 0x09 Xorout=0x00 Refin=False Refout=False

  • New CRC5-USB Poly = 0x05 Initial = 0x1F Xorout=0x1F Refin=True Refout=True

  • New CRC6-ITU Poly = 0x03 Initial = 0x00 Xorout=0x00 Refin=True Refout=True

  • New CRC7-MMC Poly = 0x09 Initial = 0x00 Xorout=0x00 Refin=False Refout=False

V0.1.4 (2017-09-21)

  • New CRC8-MAXIM8 Poly = 0x31 Initial = 0x00 Xorout=0x00 Refin=True Refout=True

  • New CRC8-ROHC Poly = 0x07 Initial = 0xFF Xorout=0x00 Refin=True Refout=True

  • New CRC8-ITU Poly = 0x07 Initial = 0x00 Xorout=0x55 Refin=False Refout=False

  • New CRC8-CRC8 Poly = 0x07 Initial = 0x00 Xorout=0x00 Refin=False Refout=False

V0.1.3 (2017-09-19)

  • New CRC16-X25

  • New CRC16-USB

  • New CRC16-MAXIM16

  • New CRC16-CCITT_FALSE

  • New CRC16-DECT

Bugfixes
  • Calculate CRC16-IBM of poly = 0x8005 is ERROR.

V0.1.2 (2017-08-22)

Platform Support
  • Win32 X64

  • Linux_x86_64

  • MacOSX_10_6_intel

  • ARMv7 (Toradex Ixora iMX6 Linux-4.1.41)

Bugfixes
  • Coding C99 standard.

  • Python/C API parsing arguments type error in linux.

V0.1.1 (2017-08-20)

  • New CRC16-DNP and CRC16-SICK

Project details


Download files

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

Source Distribution

libscrc-1.8.1.tar.gz (41.7 kB view hashes)

Uploaded source

Built Distributions

libscrc-1.8.1-cp310-cp310-win_amd64.whl (88.4 kB view hashes)

Uploaded cp310

libscrc-1.8.1-cp310-cp310-win32.whl (83.4 kB view hashes)

Uploaded cp310

libscrc-1.8.1-cp39-cp39-win_amd64.whl (92.7 kB view hashes)

Uploaded cp39

libscrc-1.8.1-cp39-cp39-win32.whl (83.4 kB view hashes)

Uploaded cp39

libscrc-1.8.1-cp38-cp38-win_amd64.whl (91.1 kB view hashes)

Uploaded cp38

libscrc-1.8.1-cp38-cp38-win32.whl (84.0 kB view hashes)

Uploaded cp38

libscrc-1.8.1-cp37-cp37m-win_amd64.whl (91.0 kB view hashes)

Uploaded cp37

libscrc-1.8.1-cp37-cp37m-win32.whl (83.9 kB view hashes)

Uploaded cp37

libscrc-1.8.1-cp36-cp36m-win_amd64.whl (91.0 kB view hashes)

Uploaded cp36

libscrc-1.8.1-cp36-cp36m-win32.whl (83.8 kB view hashes)

Uploaded cp36

libscrc-1.8.1-cp35-cp35m-win_amd64.whl (90.9 kB view hashes)

Uploaded cp35

libscrc-1.8.1-cp35-cp35m-win32.whl (86.2 kB view hashes)

Uploaded cp35

libscrc-1.8.1-cp34-cp34m-win_amd64.whl (85.8 kB view hashes)

Uploaded cp34

libscrc-1.8.1-cp34-cp34m-win32.whl (82.2 kB view hashes)

Uploaded cp34

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page