`

crc

 
阅读更多

#include <stdio.h>

int reverse_bits(int input, int bits) {
    int i, result = 0;           
   
    for (i = 0; i < bits; i++) {
        result = (result << 1) | (input & 1);
        input >>= 1;        
    }
    return result;
}

unsigned short crc5(unsigned char crc, unsigned char poly, unsigned char *ptr, int len)
{
	unsigned char i;
	
	while (len--) {
		for (i = 0x80; i != 0; i >>= 1) {
			if ((crc & 0x10) != 0) {
				crc <<= 1;
				crc ^= poly;
			} else {
				crc <<= 1;
			}
			if ((*ptr & i) != 0) {
				crc ^= poly;
			}
		}
		ptr++;
	}
	
	return crc;
}

unsigned short crc7(unsigned char crc, unsigned char poly, unsigned char *ptr, int len)
{
	unsigned char i;
	
	while (len--) {
		for (i = 0x80; i != 0; i >>= 1) {
			if ((crc & 0x40) != 0) {
				crc <<= 1;
				crc ^= poly;
			} else {
				crc <<= 1;
			}
			if ((*ptr & i) != 0) {
				crc ^= poly;
			}
		}
		ptr++;
	}
	
	return crc;
}

unsigned short crc8(unsigned char crc, unsigned char poly, unsigned char *ptr, int len)
{
	unsigned char i;
	
	while (len--) {
		for (i = 0x80; i != 0; i >>= 1) {
			if ((crc & 0x80) != 0) {
				crc <<= 1;
				crc ^= poly;
			} else {
				crc <<= 1;
			}
			if ((*ptr & i) != 0) {
				crc ^= poly;
			}
		}
		ptr++;
	}
	
	return crc ^ 0x55;
}

unsigned short crc16(unsigned short crc, unsigned short poly, unsigned char *ptr, int len)
{
	unsigned char i;
	
	while (len--) {
		for (i = 0x80; i != 0; i >>= 1) {
			if ((crc & 0x8000) != 0) {
				crc <<= 1;
				crc ^= poly;
			} else {
				crc <<= 1;
			}
			if ((*ptr & i) != 0) {
				crc ^= poly;
			}
		}
		ptr++;
	}
	
	return crc;
}

unsigned int crc32(unsigned int crc, unsigned int poly, unsigned char *ptr, int len)
{
	unsigned char i;
	
	while (len--) {
		for (i = 0x80; i != 0; i >>= 1) {
			if ((crc & 0x80000000) != 0) {
				crc <<= 1;
				crc ^= poly;
			} else {
				crc <<= 1;
			}
			if ((*ptr & i) != 0) {
				crc ^= poly;
			}
		}
		ptr++;
	}
	
	return crc;
}

int main(int argc, char** argv)
{
	unsigned char buff[] = {0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0xd2, 0xe3};
	unsigned char mac_list[][6] = {
		{0x01, 0x00, 0x5e, 0x00, 0x00, 9},
		{0x01, 0x00, 0x5e, 0x00, 0x00, 13},
		{0x01, 0x00, 0x5e, 0x00, 0x00, 48},
		{0x01, 0x00, 0x5e, 0x00, 0x00, 52},
		{0x01, 0x00, 0x5e, 0x00, 0x00, 66}
	};
	
	printf("rev: 0x%02X -> 0x%02X\n", 0x11112222, reverse_bits(0x11112222, 32));
	
	printf("crc5: 0x%02X\n", crc5(0x09, 0x09, buff, sizeof(buff) / sizeof(buff[0])));
	printf("crc7: 0x%02X\n", crc7(0x00, 0x09, buff, sizeof(buff) / sizeof(buff[0])));
	printf("crc8: 0x%02X\n", crc8(0x00, 0x07, buff, sizeof(buff) / sizeof(buff[0])));
	printf("crc16: 0x%04X\n", crc16(0x0000, 0x1021, buff, sizeof(buff) / sizeof(buff[0])));
	printf("crc32: 0x%08X\n", crc32(0xFFFFFFFF, 0x04c11db7, buff, sizeof(buff) / sizeof(buff[0])));
	/*
	printf("crc32: 0x%08X\n", crc32(0, 0x04c11db7, mac_list[0], 6));
	printf("crc32: 0x%08X\n", crc32(0, 0x04c11db7, mac_list[1], 6));
	printf("crc32: 0x%08X\n", crc32(0, 0xC704DD7B, mac_list[2], 6));
	printf("crc32: 0x%08X\n", crc32(0, 0xC704DD7B, mac_list[3], 6));
	printf("crc32: 0x%08X\n", crc32(0, 0xC704DD7B, mac_list[4], 6));*/
	
	return 0;
}

/* 
	test pass:
	crc7		--- crc-7/MMC
	crc16		--- crc-16/IBM
	crc-ccitt	---	crc16-ccitt
*/
 
分享到:
评论

相关推荐

    CRC校验工具(CRC8,CRC16,CRC32)

    本工具支持常用的所有CRC校验 比如: CRC-4/TU CRC-5/EPC CRC-5/ITU CRC-6/TU CRC-7/MMC CRC-8 CRC-8/ITU CRC-8/ROHC CRC-8/MAXIM CRC-16/BM CRC-16/MAXIM CRC-16/USB CRC-16/MODBUS CRC-16/CCITT CRC-16/CCITT-...

    CRC计算器 CRC逆向

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输和存储中的错误检测方法。它通过计算数据的校验码来检查数据的完整性,确保数据在传输或存储过程中没有发生错误。CRC计算器是用于生成或验证CRC...

    CRC_crc32_CRC16_crc64_源码

    CRC,即循环冗余校验(Cyclic Redundancy Check),是一种广泛应用于数据通信和存储中的错误检测技术。它通过计算数据的一种特定校验值,来检查数据在传输或存储过程中是否发生了错误。CRC的基本原理是利用多项式除...

    CRC.rar_CRC ITU_CRC ITU-T_CRC-16_ITU-T crc_crc

    CRC,即循环冗余校验(Cyclic Redundancy Check),是一种广泛应用于数据通信和存储领域的错误检测技术。CRC通过附加一个简短的校验码到数据块来确保数据的完整性,这个校验码是根据数据计算出来的。在标题和描述中...

    各种CRC生成工具,包括CRC8,CRC16,CRC-CCITT,CRC32

    标题提及了四种CRC类型:CRC8、CRC16、CRC-CCITT和CRC32,它们分别代表了不同宽度的CRC校验码: 1. **CRC8**:这是一种8位的CRC校验,适用于校验较短的数据块。它使用一个8位的生成多项式,计算过程相对简单,常...

    crc_add_crc8_CRC16_matlab_CRC24_crc_

    标题中的“crc_add_crc8_CRC16_matlab_CRC24_crc_”暗示这是一个关于在MATLAB环境中实现CRC计算的程序,涵盖了CRC8、CRC16和CRC24三种不同长度的校验码。CRC8适用于简单的错误检测场景,CRC16则提供更强的校验能力,...

    CRC32、CRC16、CRC原理和算法的总结

    在计算机网络通信与存储技术中,循环冗余校验(CRC,Cyclic Redundancy Check)是一种校验数据完整性的常用手段。其原理基于多项式除法,通过对数据位串进行运算,得到一个短的固定位数的校验值,即CRC校验码。CRC...

    crc32-master.zip_crc32.py_crc32碰撞密码_zip crc32_zip crc碰撞_zip利用crc

    CRC32,全称为Cyclic Redundancy Check(循环冗余校验),是一种广泛用于数据传输和存储中的错误检测方法。在本主题中,我们主要关注如何利用CRC32的特性来尝试解密某些特定的压缩包,尤其是针对标题中提到的"crc32-...

    csw-crc32-crc16-crc8.zip

    在本压缩包中,"csw-crc32-crc16-crc8.zip"包含了一个C语言实现的CRC校验库,它提供了对CRC8、CRC16和CRC32三种不同宽度的CRC校验函数。 首先,CRC8是最简单的版本,适用于只需要较小校验码的情况。CRC8通常用于低...

    CRC计算器,实现了CRC4、CRC5、CRC6、CRC7、CRC8、CRC16、CRC32等21种算法

    CRC计算器是用于生成这些校验码的工具,本项目实现的CRC计算器支持CRC4、CRC5、CRC6、CRC7、CRC8、CRC16和CRC32等多种不同的CRC算法,覆盖了从小到大多种常用位宽。 CRC的核心思想是基于多项式除法,将数据看作一个...

    crc_32_c.rar_C#CRC32校验_CRC32 查表_crc32_crc32.c

    CRC32(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信和存储领域的错误检测方法。在C#编程环境中,CRC32校验通常用于确保数据在传输或存储过程中没有发生错误。这个压缩包"crc_32_c.rar"包含了...

    CRC校验:C#实现CRC8

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输和存储中的错误检测方法。它通过计算数据的校验码来检查数据的完整性,确保数据在传输或存储过程中没有发生错误。CRC8是CRC的一种变体,其中“8...

    crc_matlabCRC32_crc_

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输和存储中的错误检测方法。它通过在数据后面附加一个校验码来确保数据的完整性。CRC32是CRC的一种特定实现,使用32位的校验码。在本主题中,我们...

    CRC计算工具,包含CRC8 、CRC16 、CTC32、MODBUS等

    CRC,全称是Cyclic Redundancy Check,中文译为循环冗余校验,是一种广泛应用于数据通信和存储系统中的错误检测技术。它通过在数据传输或存储前添加一个校验码来验证数据的完整性,确保数据在传输过程中没有发生错误...

    pb 实现crc16 crc32

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输和存储中的错误检测方法。它通过计算数据的校验码并与预期的校验码进行比较,来判断数据在传输或存储过程中是否发生错误。CRC的实现通常涉及...

    crc32/crc24函数

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验码技术。它通过计算数据的一种特定函数,生成一个简短的固定位数的校验码,附加在数据后面,接收方再进行同样的计算,以检查数据...

    STM32H743-CRC 硬件CRC算法

    IEEE 802.3 标准中规定的 CRC32 算法 在STM32H743硬件CRC 与软件CRC,同时包括MD5算法,还包含crc4_itu、crc5_epc、crc5_itu、crc5_usb、crc6_itu、crc7_mmc、crc8、crc8_itu、crc8_rohc、crc8_maxim、crc16_ibm、...

    crc16_crc编码源程序_

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验码技术。CRC编码是通过一个特定的数学算法,即生成多项式,对原始数据进行运算,生成一个固定位数的校验码,附加在原始数据后面...

    crc32_crc碰撞_

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验码技术。它通过计算数据的二进制串在某种规则下的余数,将这个余数附加到数据后面,形成一个校验码。接收方同样对接收到的数据...

Global site tag (gtag.js) - Google Analytics