#include "uss_crc.h"
uint16 uss_crc_16(uint8 *data, uint16 len, uint16 seed)
{
uint16 crc16 = seed;
uint8 i;
while (len--) {
for (i = 0x80; i != 0; i >>= 1) {
if ((crc16 & 0x8000) != 0) {
crc16 = crc16 << 1;
crc16 = crc16 ^ 0x1021;
} else {
crc16 = crc16 << 1;
}
if ((*data & i) != 0) {
crc16 = crc16 ^ 0x1021; // crc16 = crc16 ^ (0x10000 ^ 0x11021)
}
}
data++;
}
return crc16;
}
uint8 uss_crc_8(uint8 *data, uint16 len, uint8 seed, uint8 xor_out)
{
uint8 crc8 = seed;
uint8 i;
while (len--) {
for (i = 0x80; i != 0; i >>= 1) {
if ((crc8 & 0x80) != 0) {
crc8 = crc8 << 1;
crc8 = crc8 ^ 0x2F;
} else {
crc8 = crc8 << 1;
}
if ((*data & i) != 0) {
crc8 = crc8 ^ 0x2F; //crc8 = crc8 ^ (0x100 ^ 0x12F)
}
}
data++;
}
return (crc8 ^ xor_out);
}
static const uint16 crc_table[16] ={0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef};
uint16 calculated_crc16(uint16 *data, uint16 word_count) {
uint16 crc16 = 0xFFFF;//E521_42_CRC16_CALCULATE_SEED;
uint16 crc_h4, crc_l12;
while( word_count-- ) {
crc_h4 = (crc16 >> 12);
crc_l12 = (crc16 << 4);
crc16 = crc_l12 ^ crc_table[crc_h4 ^ (*data >> 12)];
crc_h4 = (crc16 >> 12);
crc_l12 = (crc16 << 4);
crc16 = crc_l12 ^ crc_table[crc_h4 ^ ((*data >> 8) & 0x0f)];
crc_h4 = (crc16 >> 12);
crc_l12 = (crc16 << 4);
crc16 = crc_l12 ^ crc_table[crc_h4 ^ ((*data & 0x00ff) >> 4)];
crc_h4 = (crc16 >> 12);
crc_l12 = (crc16 << 4);
crc16 = crc_l12 ^ crc_table[crc_h4 ^ (*data & 0x000f)];
data++;
}
return crc16;
}
uss_crc.c
-
C
86 引用 • 165 回帖 • 3 关注
C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于