C语言的CRC16方法转成java方法

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

Java - 处理unsigned类型