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

2个回答

首先,你的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;
}
weixin_38946372
weixin_38946372 谢谢~
大约一年之前 回复
dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 回复见了你女王大人喵姐还不跪下: 谢谢喵姐,受宠若惊O(∩_∩)O
大约一年之前 回复
devmiao
见了你女王大人喵姐还不跪下 很详细,可以采纳了。
大约一年之前 回复

主要就是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类型

infoworld
infoworld 回复weixin_38946372: 改了下Java方法参数类型, 把byte改为char.
大约一年之前 回复
infoworld
infoworld 回复weixin_38946372: 回复weixin_38946372: 你的结果也是a7 b0;uint8_t inf[]={0x55,0x01,0x08,0x90,0x06,0x00}; uint32_t value = usart_get_crc16(inf,sizeof(inf));
大约一年之前 回复
weixin_38946372
weixin_38946372 你好 现在我有一段 十六进制的数组 55 01 08 90 06 00 C语言那边加密后 得出的值 取后两个字节 是CE 7A ,用你解的这段试了一下 得出来的值 取后两位字节 确是 a7 b0 和 那边对不上
大约一年之前 回复
立即提问
相关内容推荐