CRC-16/CCITT-FALSE 和 CRC-16/X-25 有什么区别?
What is the difference between CRC-16/CCITT-FALSE and CRC-16/X-25?
我想实施CRC-16/X-25。我有一个用 C 语言为 CRC-16/CCITT_FALSE 编写的代码,但我不知道我需要对该代码进行哪些更改才能实现 CRC-16/X-25?
我用于 CRC-16/CCITT-FALSE 的代码如下:
#include <msp430.h>
#define CRC_POLYNOMIAL 0x1021
#define USHORT_TOPBIT 0x8000
short crc_ret;
// function initialisation
unsigned short crc16(const char *buf, unsigned int buf_len)
{
unsigned short ret = 0xFFFF; // Initial Value
int bit = 8;
do {
if (!buf) {
break;
}
unsigned int i = 0;
for (i=0; i<buf_len; ++i) {
ret = (unsigned short)(ret ^ ((unsigned short)buf[i] >> 8));
for (bit = 8; bit > 0; --bit)
{
if (ret & USHORT_TOPBIT)
ret = (unsigned short)((ret >> 1) ^ CRC_POLYNOMIAL);
else
ret = (unsigned short)(ret >> 1);
}
}
} while (0);
return ret;
}
int main(void)
{
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
char buf[16];
buf[0] = 0x5A; //buf[0], buf[1] and buf[2] are data bytes
buf[1] = 0xCF;
buf[2] = 0x00;
crc_ret = crc16(buf, 3); // Calling CRC function
}
根据以下网站,CRC16/CCITT_FALSE 与您的代码不匹配。该网站表明它是左移(非反射)CRC,而您的代码是右移。
CRC16/X25 是右移(反射)CRC,returns ~CRC(CRC xor 0xFFFF)。不知道这个和CRC16/CCITT_X25.
是不是一样的
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
您可以使用该网站将您的结果与其结果进行比较。
我从创建两个 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;
}
我想实施CRC-16/X-25。我有一个用 C 语言为 CRC-16/CCITT_FALSE 编写的代码,但我不知道我需要对该代码进行哪些更改才能实现 CRC-16/X-25?
我用于 CRC-16/CCITT-FALSE 的代码如下:
#include <msp430.h>
#define CRC_POLYNOMIAL 0x1021
#define USHORT_TOPBIT 0x8000
short crc_ret;
// function initialisation
unsigned short crc16(const char *buf, unsigned int buf_len)
{
unsigned short ret = 0xFFFF; // Initial Value
int bit = 8;
do {
if (!buf) {
break;
}
unsigned int i = 0;
for (i=0; i<buf_len; ++i) {
ret = (unsigned short)(ret ^ ((unsigned short)buf[i] >> 8));
for (bit = 8; bit > 0; --bit)
{
if (ret & USHORT_TOPBIT)
ret = (unsigned short)((ret >> 1) ^ CRC_POLYNOMIAL);
else
ret = (unsigned short)(ret >> 1);
}
}
} while (0);
return ret;
}
int main(void)
{
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
char buf[16];
buf[0] = 0x5A; //buf[0], buf[1] and buf[2] are data bytes
buf[1] = 0xCF;
buf[2] = 0x00;
crc_ret = crc16(buf, 3); // Calling CRC function
}
根据以下网站,CRC16/CCITT_FALSE 与您的代码不匹配。该网站表明它是左移(非反射)CRC,而您的代码是右移。
CRC16/X25 是右移(反射)CRC,returns ~CRC(CRC xor 0xFFFF)。不知道这个和CRC16/CCITT_X25.
是不是一样的http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
您可以使用该网站将您的结果与其结果进行比较。
我从创建两个 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;
}