`

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

    Modbus RTU CRC校验详细步骤CRC值怎么计算

    RTU 模式采用CRC(Cyclical Redundancy Check)侦误值。 CRC 侦误值计算以下列步骤说明: 步骤一:载入一个内容为 FFFFH 之16-bits 寄存器,称之为『CRC』寄存器。 步骤二:将指令信息的第一个位组与16-bits CRC ...

    CRC-Calc.zip

    crc5_epc,crc5_itu,crc5_usb,crc6_itu,crc7_mmc,crc8,crc8_itu,crc8_rohc,crc8_maxim,crc16_ibm,crc16_maxim,crc16_usb,crc16_modbus,crc16_ccitt,crc16_ccitt_false,crc16_x25,crc16,xmodem,crc16_dnp,crc32,crc32_...

    史上最强的CheckSum CRC校验工具

    此CRC校验工具支持:CRC3、CRC4、CRC5、CRC6、CRC7、CRC8、CRC11、CRC12、CRC13、CRC14、CRC15、CRC16、CRC17、CRC21、CRC24、 CRC30、CRC31、CRC32、CRC40、CRC64、CRC82、Adler32全面的105种CRC算法,支持显示标准...

    CRC计算器 CRC逆向

    CRC计算器 CRC逆向,CRC所有参数可自定义

    CRC计算工具V3.3.0-64

    CRC-8 正序、CRC-8 逆序、CRC-16 (0xA001)、CRC-16 (0x8005)、CRC-16 (Modbus)、CRC-16 (Sick)、CRC-CCITT (XModem)、CRC-CCITT (0xFFFF)、CRC-CCITT (0x1D0F)、CRC-CCITT (Kermit)、CRC-DNP、IntelHex、BCC (异或...

    CRC-16/MODBUS-JAVA

    CRC校验(循环冗余校验)小知识 CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输...

    CRC8 CRC16

    CRC-8 (正序) CRC-8 (逆序) CRC-16 (0xA001) CRC-16 (0x8005) CRC-16 (Modbus) CRC-CCITT (XModem) CRC-CCITT (Kermit) CRC-DNP IntelHex BCC (异或校验) LRC (纵向冗余校验) CRC-32 (循环冗余)

    使用公式节点计算CRC16校验码,版本labview2017

    unsigned int crc_cal16 (unsigned char *snd, unsigned char num){unsigned int c,crc=0xFFFF;for(i = 0; i ; i ++){c = snd[i] & 0x00FF;crc ^= c;for(j = 0;j ; j ++) {if (crc & 0x0001){crc&gt;&gt;=1;crc^=0xA001;}...

    CRC32 查表法源代码详细说明

    因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都...

    CRC - 16算法与FPGA实现

    以16位CRC - 16校验码为例,在对CRC校验码原理和一般的串行CRC生成算法进行分析的基础上,改进 了串行CRC算法,并进一步推导出并行CRC算法。利用Quartus II集成环境和Verilog HDL语言工具将算法转 变为校验码生成电路,...

    C#计算CRC16校验码示例

    遇到要做个CRC校验,翻了一堆资料终于看明白了,内有详细注释,不是普通的词典法,是用算法计算出来的CRC,对于CRC16-CCITT,只需替换公式即可 /* CRC16实现原理 * * CRC16 | g(x)=x16+x15+x2+1 | 0x1,80,05 | ...

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

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

    crc8查表法校验程序和校验检查软件

    crc8校验的原理,程序和检验软件 CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 CRC校验可以简单地描述为:例如...

    CAN总线通信的CRC校验方法

    CAN通信采用CRC校验作为一种重要的错误检测手段,是节点判断CAN帧信息的完整性并产生确认应答的依据。  在现场总线通信和控制的实际应用中,工业应用环境往往是极端的温度以及电磁噪声或是其他的恶劣环境,系统在...

    VB实现CRC校验程序源码

    资源名:VB实现CRC校验程序源码 资源类型:程序源代码 源码说明: CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环...

    通用 CRC算法 的纯Rust实现_rust_代码_下载

    CRC-3/GSM,CRC-3/ROHC,CRC-4/G-704,CRC-4/INTERLAKEN,CRC-5/EPC-C1G2,CRC-5/G-704,CRC-5/USB,CRC-6/CDMA2000-A, CRC-6/CDMA2000-B,CRC-6/DARC,CRC-6/G-704,CRC-6/GSM,CRC-7/MMC,CRC-7/ROHC,CRC-7/UMTS,CRC-8/AUTOSAR...

    crc32的matlab程序

    CRC32计算程序,生成多项式是: G(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 该生成多项式是IEEE的标准,应用在ETH,wifi等多个协议里面。 电脑上的文件校验工具,也基本采用这个crc32. 用matlab...

    CRC校验源代码(C#)

    1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。  2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’...

    [硬件指令优化系列]汇编CRC32指令

    纯软件实现CRC32经常是借助于查表实现的,当计算CRC32过于频繁时可通硬件指令优化以减少对CPU的占用。目前Intel支持的用于计算CRC的有CRC32和PCLMULQDQ两个指令。本文仅讨论使用CRC32指令的使用。CRC32指令计算的是...

Global site tag (gtag.js) - Google Analytics