CRC-16/CCITT算法实现

1、C语言版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//截取指定长度的字符串
char* substring(char *dst,char *src,int start,int len) {
	char *p=dst;
	char *q=src;
	int length=strlen(src);
	if(start>=length||start<0)
		return NULL;
	if(len>length)
		len=length-start;
	q+=start;
	while(len--) {
		*(p++)=*(q++);
	}
	*(p++)='\0';
	return dst;
}

//将字串转成指定数组
char**  INIT_ARR(char *str,int t) {
	int len=t/2;
	printf("len: %d\n", len);
	int i;
	char arr[len][2];
	for(i=0; i<len; i++) {
		substring(arr[i],str,i*2,2);
	}
	printf("%s\n","init  arr  suc");
	
	
	return arr;
}

//crc16 算法
unsigned short crc16(unsigned char *arr, unsigned int len) {
	unsigned short crc_in = 0x0000;
	unsigned short crc_poly = 0x8408; 
	unsigned char ch = 0;
	unsigned char i;
	while(len--) {
		ch = *(arr++);
		crc_in^=ch;
		for(i=0; i<8; i++) {
			if(crc_in&0x0001) {
				crc_in=(crc_in>>1)^crc_poly;
			} else {
				crc_in=crc_in>>1;
			}
		}
	}
	return  (crc_in);
}


int main(int argc, char *argv[]) {
	///7d7d00000001000011001c010c37452971053738363134394a0756312e302e30300000000000008efe
	unsigned char ch[]="00000001000011001c010c37452971053738363134394a0756312e302e3030000000000000";
	typedef unsigned char   uint8_t;
	uint8_t arr[] = {0x00,0x00,0x00,0x01,0x00,0x00,0x11,0x00,0x1c,
	                 0x01,0x0c,0x37,0x45,0x29,0x71,0x05,0x37,0x38,
	                 0x36,0x31,0x34,0x39,0x4a,0x07,0x56,0x31,0x2e,
	                 0x30,0x2e,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00
	                };
	unsigned short  res = crc16(arr,sizeof(arr));
	printf("res:%d\n",res);
	return 0;
}

2、java版实现

 public  static   String  genCrc16(String  cmd){
        int length = cmd.length();
        assert length%2==0;
        int len = length / 2;
        String[] arr=new String[len];
        for (int i=0; i<len;i++) {
            arr[i]=cmd.substring(i*2,i*2+2);
        }
        int  wCrcIn=0x0000,wCrcPoly=0x8408,constantLen=8;
        for (String  ch : arr) {
            wCrcIn^=Integer.parseInt(ch,16);
            for(int i=0;i<constantLen;i++){
                boolean  f= (wCrcIn & 0x0001)==1;
                wCrcIn=f?((wCrcIn>>1)^ wCrcPoly):(wCrcIn>>1);
            }
         }
        return Integer.toHexString(wCrcIn);
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值