一、CRC编码简介
CRC 的英文全称为 Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码)。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
二、CRC编码过程
以下步骤将描述 6 字节红外控制码生成过程:
1.从二维码的中依次顺序提取前 2 个英文字母、最后 2 个英文字母(X、x 除外,取英文字母 ASCII 值为原始数据),并从中提取出多项式 g(x)(多项式的最高位为 x16,最低为 1);
2.预置 1 个 16 位的寄存器为十六进制 FFFF(即全为 1),称此寄存器为 CRC 寄存器;
3.把第一个 8 位二进制数据(既原始数据的第一个字节)与 16 位的 CRC 寄存器的低8 位相异或,把结果放于 CRC 寄存器,高八位数据不变;
4.CRC 寄存器向右移一位,MSB(最高位)补零,并检查右移后的移出位 LSB(最低位)。
5.如果 LSB 为 0,重复第 4 步;若 LSB 为 1,CRC 寄存器与多项式码相异或。
6.重复第 4 与第 5 步直到 8 次移位全部完成。此时一个 8-bit 数据处理完毕。
7.重复第 3 至第 5 步直到将剩下 3 个原始数据全部处理完成。
8.最终 CRC 寄存器的内容即为 CRC 值。
9.取 CRC 的得高八位作为红外控制码的第一字节,按顺序取原始数据为红外控制码的二、三、四、五字节,取 CRC 值的低八位为红外控制码的第六字节。
三、算法示例
从二维码中提取的字符串数据为:<Aa12x16,Fg.5tx15/x2+\1/hgBb>,则提取出的 4 个英文字符为 AaBb,多项式 g(x)=x16+x15+x2+1;
提取原始数据为 0x41、 0x61、 0x42 、0x62,多项式码为 0xA001(由多项式忽略了最高位的"1",得到生成项是 0x8005,其中 0xA001 为 0x8005 按位颠倒之后的结果);计算得到的 CRC 码值为 0x8FF4; 所得 6 字节红外控制码为:0x8f 0x41 0x61 0x42 0x62 0xf4。
四、具体代码如下:
import java.util.ArrayList;
import java.util.List;
public class CRC {
public static void main(String[] args) {
String s = "<Aa12x16,Fg.5tx15/x2+\1/hgBb>";
String order = getOrder(s);
System.out.println(order);
}
public static String getOrder(String s){
// 得到前两位和最后两位英文字母
String result_s = decode_S(s);
String fin = result_s.subSequence(0, 2).toString().concat(result_s.subSequence(result_s.length()