Crc ccitt(0x1d0f)计算C
Crc ccitt (0x1d0f) calculating in C
我有一组十六进制值。
我已经预先计算了它的 CRC-CCITT (0x1d0f),它是:0xD7F2
我根据 javascript 中写的工作 crc 算法写了一个算法,我用相同的数据条目 (calculation here).
测试了它
我用 C 重写了它,但不幸的是,我得到的输出与预期的不同,实际上:0xB5DB
。
所以,我的问题是:算法内部可能有问题吗?错误的数据类型会导致问题吗?
这里是一个大小为2的简单数组的例子。计算器的计算结果是0x9770,我的算法结果是0x5D80。
计算算法:
unsigned int crcTest[2] = {0xB6FE,0x8C4A};
int main (void){
unsigned int crc = doCrc(crcTest,2);
printf("Correct CRC16-CCITT is: 0x9770\n");
printf("Calculated result func : 0x%X\n", crc);
return 0;
}
unsigned int doCrc(unsigned int *data, int size)
{
int i, j;
unsigned int crc = 0x1d0f;
for (i = 0; i < size; i++){
unsigned int xr = data[i] << 8;
crc = crc^xr;
for (j = 0; j < 8; j++)
{
if (crc & 0x8000){
crc = (crc << 1);
crc = crc ^ 0x1021;
}
else{
crc = crc << 1;
}
}
}
crc = crc & 0xFFFF;
return crc;
}
整个源代码 main.c : Download here
JavaScript 实际有效的代码:
CRC1D0F: function() {
var str = this.CleanedString;
var crc = 0x1d0f;
for (var c = 0; c < str.length; c++) {
crc ^= str.charCodeAt(c) << 8;
for (var i = 0; i < 8; i++) {
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc = crc << 1;
}
}
return crc & 0xFFFF;
您的代码几乎正确:
应该是:
unsigned int doCrc(unsigned char *data, int size)
而不是:
unsigned int doCrc(unsigned int *data, int size)
这个有效:
#include <stdio.h>
#include <stdlib.h>
unsigned int doCrc(unsigned char *data, int size)
{
int i, j;
unsigned int crc = 0x1d0f;
for (i = 0; i < size; i++) {
unsigned int xr = data[i] << 8;
crc = crc ^ xr;
for (j = 0; j < 8; j++)
{
if (crc & 0x8000) {
crc = (crc << 1);
crc = crc ^ 0x1021;
}
else {
crc = crc << 1;
}
}
}
crc = crc & 0xFFFF;
return crc;
}
unsigned char data[] = "1234567890";
int main(int argc, char *argv[])
{
printf("%0x\n", doCrc(data, strlen(data)));
}
预期输出:
57d8
这与我们得到的相同here。
我有一组十六进制值。
我已经预先计算了它的 CRC-CCITT (0x1d0f),它是:0xD7F2
我根据 javascript 中写的工作 crc 算法写了一个算法,我用相同的数据条目 (calculation here).
测试了它我用 C 重写了它,但不幸的是,我得到的输出与预期的不同,实际上:0xB5DB
。
所以,我的问题是:算法内部可能有问题吗?错误的数据类型会导致问题吗?
这里是一个大小为2的简单数组的例子。计算器的计算结果是0x9770,我的算法结果是0x5D80。
计算算法:
unsigned int crcTest[2] = {0xB6FE,0x8C4A};
int main (void){
unsigned int crc = doCrc(crcTest,2);
printf("Correct CRC16-CCITT is: 0x9770\n");
printf("Calculated result func : 0x%X\n", crc);
return 0;
}
unsigned int doCrc(unsigned int *data, int size)
{
int i, j;
unsigned int crc = 0x1d0f;
for (i = 0; i < size; i++){
unsigned int xr = data[i] << 8;
crc = crc^xr;
for (j = 0; j < 8; j++)
{
if (crc & 0x8000){
crc = (crc << 1);
crc = crc ^ 0x1021;
}
else{
crc = crc << 1;
}
}
}
crc = crc & 0xFFFF;
return crc;
}
整个源代码 main.c : Download here
JavaScript 实际有效的代码:
CRC1D0F: function() {
var str = this.CleanedString;
var crc = 0x1d0f;
for (var c = 0; c < str.length; c++) {
crc ^= str.charCodeAt(c) << 8;
for (var i = 0; i < 8; i++) {
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc = crc << 1;
}
}
return crc & 0xFFFF;
您的代码几乎正确:
应该是:
unsigned int doCrc(unsigned char *data, int size)
而不是:
unsigned int doCrc(unsigned int *data, int size)
这个有效:
#include <stdio.h>
#include <stdlib.h>
unsigned int doCrc(unsigned char *data, int size)
{
int i, j;
unsigned int crc = 0x1d0f;
for (i = 0; i < size; i++) {
unsigned int xr = data[i] << 8;
crc = crc ^ xr;
for (j = 0; j < 8; j++)
{
if (crc & 0x8000) {
crc = (crc << 1);
crc = crc ^ 0x1021;
}
else {
crc = crc << 1;
}
}
}
crc = crc & 0xFFFF;
return crc;
}
unsigned char data[] = "1234567890";
int main(int argc, char *argv[])
{
printf("%0x\n", doCrc(data, strlen(data)));
}
预期输出:
57d8
这与我们得到的相同here。