Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Smartcard CRC-16/CCITT-FALSE和CRC-16/X-25之间的区别是什么?_Smartcard_Crc_Nxp Microcontroller - Fatal编程技术网

Smartcard CRC-16/CCITT-FALSE和CRC-16/X-25之间的区别是什么?

Smartcard CRC-16/CCITT-FALSE和CRC-16/X-25之间的区别是什么?,smartcard,crc,nxp-microcontroller,Smartcard,Crc,Nxp Microcontroller,我想实现CRC-16/X-25。我有一个用C写的CRC-16/CCITT_FALSE代码,但我不知道我需要对CRC-16/X-25实现的代码做什么更改 我用于CRC-16/CCITT-FALSE的代码如下所示: #包括 #定义CRC_多项式0x1021 #定义USHORT_首位0x8000 短crc_-ret; //函数初始化 无符号短crc16(常量字符*buf,无符号整数buf_len) { 无符号短ret=0xFFFF;//初始值 int位=8; 做{ 如果(!buf){ 打破 } 无符号

我想实现CRC-16/X-25。我有一个用C写的CRC-16/CCITT_FALSE代码,但我不知道我需要对CRC-16/X-25实现的代码做什么更改

我用于CRC-16/CCITT-FALSE的代码如下所示:

#包括
#定义CRC_多项式0x1021
#定义USHORT_首位0x8000
短crc_-ret;
//函数初始化
无符号短crc16(常量字符*buf,无符号整数buf_len)
{
无符号短ret=0xFFFF;//初始值
int位=8;
做{
如果(!buf){
打破
}
无符号整数i=0;
对于(i=0;i>8));
用于(位=8;位>0;--位)
{
如果(翻新和加固顶部)
ret=(无符号短)((ret>>1)^CRC\U多项式);
其他的
ret=(无符号短)(ret>>1);
}
}
}而(0);
返回ret;
}
内部主(空)
{
PM5CTL0&=~LOCKLPM5;//禁用GPIO开机默认高阻抗模式以激活
//以前配置的端口设置
char-buf[16];
buf[0]=0x5A;//buf[0]、buf[1]和buf[2]是数据字节
buf[1]=0xCF;
buf[2]=0x00;
crc_ret=crc16(buf,3);//调用crc函数
}

根据以下网站,CRC16/CCITT\U FALSE与您的代码不匹配。该网站表明这是一个左移(非反射)CRC,而您的代码是右移

CRC16/X25是右移(反射)CRC,返回~CRC(CRC xor 0xFFFF)。我不知道这是否与CRC16/CCITT_X25相同

您可以使用该网站将您的结果与其结果进行比较

我从一个简单的示例开始创建两个crc16函数:

uint16_t crc16_ccitt_false(char* pData, int length)
{
    int i;
    uint16_t wCrc = 0xffff;
    while (length--) {
        wCrc ^= *(unsigned char *)pData++ << 8;
        for (i=0; i < 8; i++)
            wCrc = wCrc & 0x8000 ? (wCrc << 1) ^ 0x1021 : wCrc << 1;
    }
    return wCrc;
}

uint16_t crc16_x25(char* pData, int length)
{
    int i;
    uint16_t wCrc = 0xffff;
    while (length--) {
        wCrc ^= *(unsigned char *)pData++ << 0;
        for (i=0; i < 8; i++)
            wCrc = wCrc & 0x0001 ? (wCrc >> 1) ^ 0x8408 : wCrc >> 1;
    }
    return wCrc ^ 0xffff;
}
uint16\u t crc16\u ccitt\u false(字符*数据,整数长度)
{
int i;
uint16_t wCrc=0xffff;
while(长度--){
wCrc^=*(无符号字符*)pData++1;
}
返回wCrc^0xffff;
}

根据以下网站,CRC16/CCITT\U FALSE与您的代码不匹配。该网站表明这是一个左移(非反射)CRC,而您的代码是右移

CRC16/X25是右移(反射)CRC,返回~CRC(CRC xor 0xFFFF)。我不知道这是否与CRC16/CCITT_X25相同

您可以使用该网站将您的结果与其结果进行比较

我从一个简单的示例开始创建两个crc16函数:

uint16_t crc16_ccitt_false(char* pData, int length)
{
    int i;
    uint16_t wCrc = 0xffff;
    while (length--) {
        wCrc ^= *(unsigned char *)pData++ << 8;
        for (i=0; i < 8; i++)
            wCrc = wCrc & 0x8000 ? (wCrc << 1) ^ 0x1021 : wCrc << 1;
    }
    return wCrc;
}

uint16_t crc16_x25(char* pData, int length)
{
    int i;
    uint16_t wCrc = 0xffff;
    while (length--) {
        wCrc ^= *(unsigned char *)pData++ << 0;
        for (i=0; i < 8; i++)
            wCrc = wCrc & 0x0001 ? (wCrc >> 1) ^ 0x8408 : wCrc >> 1;
    }
    return wCrc ^ 0xffff;
}
uint16\u t crc16\u ccitt\u false(字符*数据,整数长度)
{
int i;
uint16_t wCrc=0xffff;
while(长度--){
wCrc^=*(无符号字符*)pData++1;
}
返回wCrc^0xffff;
}

非常感谢您的回复。在您编写的这两个函数中,我可以将多项式从0x8408更改为0x1021吗?因为我的多项式是0x1021。@RazaJaved-对于X25,位是反转的,最高有效位是位0,并且数据字节和CRC在循环时都右移,所以多项式也需要反转,所以它的最高有效位是位0(忽略x^16项,该项在代码测试中暗示为1)(wCrc&0x001)右移前),最后是0x8408。非常感谢您的回复。在您编写的这两个函数中,我可以将多项式从0x8408更改为0x1021吗?因为我的多项式是0x1021。@RazaJaved-对于X25,位是反向的,最高有效位是位0,数据字节和CRC在循环时都向右移位,因此多项式也需要反转,所以它的最高有效位是位0(忽略右移之前的代码测试(wCrc&0x001)暗示为1的x^16项),最终为0x8408。