Home

Awesome

PyPI - Version PyPI - Python Version PyPI - License

libscrc

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

CRCxCRC8CRC16CRC24CRC32CRC64
CRC3-GSMINTELMODBUSBLEFSCGO-ISO
CRC3-ROHCBCCIBMOPENPGPCRC32ECMA182
CRC4-ITULRCXMODEMLTE-AMPEG2WE
CRC5-ITUMAXIM8CCITTLTE-BADLER32XZ64
CRC5-EPCROHCKERMITOS9FLETCHER32
CRC5-USBITU8MCRF4XXFLEXRAY-APOSIX
CRC6-ITUCRC8SICKFLEXRAY-BBZIP2
CRC6-GSMSUM8DNPINTERLAKENJAMCRC
CRC6-DARCFLETCHER8X25CRC24AUTOSAR
CRC7SMBUSUSBC / ISCSI
CRC7-MMCAUTOSARMAXIM16D / BASE91-D
CRC7-UMTSLTEDECT(R/X)Q / AIXM
CRC7-ROHCSAE-J1850TCP/UDPXFER
I-CODECDMA2000CKSUM
CAN15GSM-AFLETCHER16XZ32
CAN17NRSC-5EPC16AAL5
CAN21WCDMAPROFIBUSISO-HDLC
BLUETOOTHBUYPASSPKZIP
CRC10-ATMDVB-S2GENIBUSADCCP
CRC13-BBCEBUGSM16V-42
MPT1327DARCRIELLOSTM32
CDMA2000MIFAREOPENSAFETYECMXF
LIN1.3EN13757
LIN2.xCMSCRC30-CDMADARC82
ID8CRC31-PHILIPS
NMEA
MODBUS_ASC

Installation

  1. 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.

  1. Cross-compile ( Linux for ARM )
#export PATH=/mnt/tools/gcc-linaro-6.2.1/bin/:$PATH
#export CROSS_COMPILE=arm-linux-gnueabihf-
#export CC='${CROSS_COMPILE}gcc -pthread'
#export LDSHARED='${CROSS_COMPILE}gcc -shared'
#export CFLAGS='-I/usr/include/python3 -I/usr/include/'

#python3 setup.py bdist_wheel
#
#auditwheel repair dist/libscrc-1.8.1-cp311-cp311-linux_x86_64.whl
#cd wheelhouse
#ls 
#libscrc-1.8.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl
  1. 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

  1. 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.gsm6(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')
  1. 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')

# LIN Protocol 1.3 (CLASSIC)
# Frame ID : 0x15	DATA : 0x5B, 0x67
crc8 = libscrc.lin(bytes([0x15, 0x5B, 0x67]))
# LIN Protocol 2.x (ENHANCED)
# Frame ID : 0x15
# DATA : 0x5B, 0x67, 0x72, 0xAF, 0x5B
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

# Return value is bytes (b'FA')
crc8 = libscrc.modbus_asc(b'010300010001')      # Modbus(ASCII) checksum.

  1. 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.mcrf4xx(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'\x45\x00\x00\x3c\x00\x00\x00\x00\x40\x11\x00\x00\xc0\xa8\x2b\xc3\x08\x08\x08\x08\x11'
crc16 = libscrc.tcp( data )             # 13933
crc16 = libscrc.udp( data )             # 13933

# init=0xFFFF(default)
# xorout=0x0000(default)
crc16 = libscrc.hacker16( b'123456789', poly=0x8005 )
crc16 = libscrc.hacker16( b'123456789', poly=0x8005, init=0xFFFF, xorout=0x0000, refin=True, refout=True )

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')
  1. 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')
  1. CRC32
crc32 = libscrc.fsc(b'1234')            # Ethernet frame sequence (FSC)
crc32 = libscrc.mpeg2(b'1234')          # MPEG2
crc32 = libscrc.crc32(b'1234')          # WinRAR, File

# init=0x00000000(default)
# xorout=0xFFFFFFFF(default)
crc32 = libscrc.hacker32( b'123456789', poly=0x04C11DB7 )
crc32 = libscrc.hacker32( b'123456789', poly=0x04C11DB7, init=0, xorout=0xFFFFFFFF, refin=True, refout=True )

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_hdlc32(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
  1. CRC64
crc64 = libscrc.iso(b'1234')
crc64 = libscrc.ecma182(b'1234')
crc64 = libscrc.we(b'1234')
crc64 = libscrc.xz64(b'1234')

# init=0x0000000000000000L(default)
# xorout=0x0000000000000000(default)
crc64 = libscrc.hacker64(b'123456789', poly=0x42F0E1EBA9EA3693, init=0, xorout=0, refin=False, refout=False )

7.CRC82

crc82 = libscrc.darc82(b'123456789')

NOTICE

V1.8.1 (2022-08-18)


V1.8 (2022-03-04)


New add modbus (ASCII) LRC checksum.

  1. CRC8 -> libscrc.modbus_asc()

V1.7 (2021-06-07)


  1. New add CRC8 -> libscrc.id8() and libscrc.nmea()
  2. Update gradually calculate functions ( CRCx -> libscrc.umts12() libscrc.crc12_3gpp() )
  3. Fixed Issues #8

V1.6(2021-01-18)


  1. New add CRC32 -> libscrc.stm32()

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

V1.4(2020-08-04)


V1.1(2020-04-20)


V1.0 (2020-03-23)


V0.1.5 (2017-09-22)


V0.1.4 (2017-09-21)


V0.1.3 (2017-09-19)


Bugfixes

V0.1.2 (2017-08-22)


Platform Support

Bugfixes

V0.1.1 (2017-08-20)