Smartcard CRC-16/CCITT-FALSE和CRC-16/X-25之间的区别是什么?
我想实现CRC-16/X-25。我有一个用C写的CRC-16/CCITT_FALSE代码,但我不知道我需要对CRC-16/X-25实现的代码做什么更改 我用于CRC-16/CCITT-FALSE的代码如下所示: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_多项式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。