echo '' ;

CRC

A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to identify accidental changes to raw data. Blocks of data entering these systems receive a short check value based on the remainder of a polynomial division of their contents. This method primarily detects data errors during data transmission and reception. Different types of Cheks are available based on the number of bits used.

CC
CRC

The sender and receiver share a generator polynomial. They utilize it whenever storing or transmitting digital data. The risk of data corruption exists in such processes. To address this risk, transmitted messages undergo segmentation into predetermined lengths. Subsequently, these segments are divided by a fixed divisor, and the remainder of this division gets calculated and appended to the message before transmission. Upon message reception, the recipient recalculates the remainder and compares it to the transmitted remainder. If the numbers fail to match, an error is detected. This process contributes to ensuring the integrity of transmitted data in digital systems.

You can access web-based online tools for Error Check calculation at this link: https://crccalc.com/

CRC Types

  • Many different types are available for error detection.
  • Mainly based on the bits we can segregate some types are 1Bit, 4Bits, 8 Bits, 16 Bits, 32Bits, 64bits.
  • Some other types MD5/SHA1/SHA256.
  • We do have an IP within the device, but the application needs to call and use it specifically when applicable. It is a 64 implementation.

AlgorithmAlgorithmAlgorithmHash Algo Result (Only HEX)
8/CDMA200016/CCITT-FALSE32/BZIP2MD5
8/DARC16/ARC32CSHA1
8/DVB-S216/AUG-CCITT32DSHA256
8/EBU16/BUYPASS32/MPEG-2
8/I-CODE16/CDMA200032/POSIX
8/ITU16/DDS-11032Q
8/MAXIM16/DECT-R32/JAMCRC
8/ROHC16/DECT-X32/XFER
8/WCDMA16/DNP
16/EN-13757
16/GENIBUS
16/MAXIM
16/MCRF4XX
16/RIELLO
16/T10-DIF
16/TELEDISK
16/TMS37157
16/USB
A
16/KERMIT
16/MODBUS
16/X-25
16/XMODEM

Error Detection using CRC

A simple error-detection scheme in which each transmitted message is accompanied by a numerical value based on the number of set bits in the message. The receiving station then applies the same formula to the message and checks to make sure the accompanying numerical value is the same. If not, the receiver can assume that the message has been garbled.


ARC 16 Algorithm

The below code is for ARC 16

/*ArunEworld*/
#include <stdio.h>
#include <stdint.h>

//Table for CRC values
static const uint16_t CrcArc16Table[] =
{
	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
	0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
	0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
	0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
	0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
	0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
	0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
	0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
	0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
	0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
	0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
	0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
	0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
	0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
	0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
	0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
	0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
	0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
	0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
	0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
	0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
	0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
	0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
	0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
	0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
	0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
	0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
	0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
	0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
	0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
	0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
	0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040,
};

uint16_t CrcArc16(const uint8_t* BufPtr, uint16_t Length, uint16_t SeedValue)
{
	const uint8_t* BufPtrAddr = BufPtr;
	uint32_t CrcVal = SeedValue;

	if (BufPtrAddr)
	{
		while (Length != 0)
		{
			Length -= 1;
			CrcVal = (CrcVal >> 8) ^ CrcArc16Table[(*BufPtrAddr ^ CrcVal) & 0x00FF];
			BufPtrAddr += 1;
		}
	}
	return (uint16_t)CrcVal;
}

int main()
{
	char Buf[]={'A','r','u','n','E','w','o','r','l','d','\0'};
	int result = CrcArc16(Buf,sizeof(Buf), 0);
	printf("Given String :%s \n",Buf);
	printf("CRC ARC 16 value :%x \n",result );

	return 0;
}

/************* OutPut *********/
/*
Given String :ArunEworld
CRC ARC 16 value :514

...Program finished with exit code 0
Press ENTER to exit console.
*/
/***********************************/

Reference


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Discover more from ArunEworld

Subscribe now to keep reading and get access to the full archive.

Continue reading