近期对接客户 利用串口通信,其中要用到CRC-IBM 8005 校验方式,网上搜寻好久,就是对不上计算器算出来的结果,最后通过一个国外的开源CRC代码,自己扣取成功:
先贴上 代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define CRC_POLY_SICK 0x8005
#define CRC_START_SICK 0x0000
unsigned short crc_sick( const unsigned char *input_str, size_t num_bytes ) {
unsigned short crc;
unsigned short low_byte;
unsigned short high_byte;
unsigned short short_c;
unsigned short short_p;
int a;
crc = CRC_START_SICK;
short_p = 0;
for (a=0; a<num_bytes; a++) {
printf("input_str[a] is %x\n",input_str[a]);
short_c = 0x00ff & (unsigned short) input_str[a];
if ( crc & 0x8000 ) crc = ( crc << 1 ) ^ CRC_POLY_SICK;
else crc = crc << 1;
crc ^= ( short_c | short_p );
short_p = short_c << 8;
}
low_byte = (crc & 0xff00) >> 8;
high_byte = (crc & 0x00ff) << 8;
crc = low_byte | high_byte;
printf("low_byte:0x%x;high_byte:0x%x \n",low_byte,high_byte);
return crc;
} /* crc_sick */
// AA 00 00 0B 0B 01 00 00
int main()
{
unsigned char protocol_buffer_open_wifi[8] = {0xAA,0x00,0x00,0x0B,0x0B,0x01,0x00,0x00};
unsigned short crc_val = crc_sick(protocol_buffer_open_wifi, 8);
unsigned char CRChi = (unsigned char)(crc_val >> 8); //高八位
unsigned char CRClo = (unsigned char)crc_val;
printf("CRChi:0x%x CRClo:0x%x \n",CRChi,CRClo);
return 0;
}
但这只是IBM的8005标准,其他标准可以下载源码移植:
在线 计算 全套CRC 工具:https://www.lammertbies.nl/comm/info/nl_crc-calculation.html
全套CRC开源代码下载:https://www.libcrc.org/
验证结果:
(高低位反了,记得更换下)