赞
踩
当数据帧长度在8bits-128bits范围内时,推荐CRC-8(CRC-8能够减少额外比特的开销,且有更好的性能表现)
当数据帧长度在128bits-2048bits范围内时,推荐CRC-12,CRC-16,CRC-CCITT(CRC-12额外比特的开销更小,且用于6bit字符流的传输;对于16bits的标准,更推荐美国标准CRC-16,性能略优于CRC-CCITT);
当因数据帧长度更长、信道不稳定等情况而需要更高的性能时,CRC-32、CRC-32C将是更好的选择;
CRC16的校验码是两个字节,所以Redis的源码中使用了 uint16_t类型(unsigned short int)
CRC16要校验的数据位是8位
在求解CRC校验码的过程中,会用到模二除,实际我们最后不关心它的商Q(x),只关心关心余数R(x),它也是两个字节的大小
余数R(x)分为高字节RH(x)和低字节RL(x)两个部分:R(x) = RH(x) * X^8 + RL(x) (这个+,可以理解成异或,也可以理解成+号)
任何数和0异或结果还是这个数
Redis使用的是CRC-16-CCITT标准,即G(x)为:x^16 + x^12 + x^5 + 1 。
G(x)的通常表征方式是将多项式转换成二进制: 1 0001 0000 0010 0001。用十六进制表示为:0x11021。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。