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