C语言的CRC16方法转成java方法
问题描述:
unsigned int usart_get_crc16(unsigned char* pData, unsigned int usLen)
{
unsigned char i;
unsigned int crc=0x0ffff;
while (usLen-- != 0) {
for (i = 0x80; i != 0; i /= 2) {
if ((crc & 0x8000) != 0) {
crc *= 2;
crc ^= 0x8005;
} else
crc *= 2;
if ((*pData & i) != 0)
crc ^= 0x8005;
}
pData++;
}
return crc & 0x0ffff;
}
答
首先,你的c语言版本的结果是
#include <stdio.h>
unsigned int usart_get_crc16(unsigned char* pData, unsigned int usLen)
{
unsigned char i;
unsigned int crc=0x0ffff;
while (usLen-- != 0) {
for (i = 0x80; i != 0; i /= 2) {
if ((crc & 0x8000) != 0) {
crc *= 2;
crc ^= 0x8005;
} else
crc *= 2;
if ((*pData & i) != 0)
crc ^= 0x8005;
}
pData++;
}
return crc & 0x0ffff;
}
int main()
{
unsigned char arr[] = {0x55, 0x01, 0x08, 0x90, 0x06, 0x00 };
int n = usart_get_crc16(arr, 6);
printf("%08X", n);
return 0;
}
0000A7B0
你说这个和你的不同,说明你给的输入数据不对。你得重新提供。
改写的程序如下
int usart_get_crc16(char[] pData, int usLen)
{
char i;
int crc=0x0ffff;
int ipData = 0;
while (usLen-- != 0) {
for (i = 0x80; i != 0; i /= 2) {
if ((crc & 0x8000) != 0) {
crc *= 2;
crc ^= 0x8005;
} else
crc *= 2;
if ((pData[ipData] & i) != 0)
crc ^= 0x8005;
}
ipData++;
}
return crc & 0x0ffff;
}
答
主要就是unsigned的问题和数组的问题. 数组可以用char[], unsigned没有移位关系不大.
long usart_get_crc16(char pData[])
{
int usLen = pData.length;
int i;
long crc=0x0ffff;
int index = 0;
while (usLen-- != 0) {
for (i = 0x80; i != 0; i /= 2) {
if ((crc & 0x8000) != 0) {
crc *= 2;
crc ^= 0x8005;
} else
crc *= 2;
if ((pData[index] & i) != 0)
crc ^= 0x8005;
}
index++;
}
return crc & 0x0ffff;
}