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);
    }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐