在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术。
循环冗余检验的原理
冗余码的计算
接收端对收到的每一帧进行 CRC 检验
冗余码的计算举例
模2除法步骤
package computernetwork; // 循环冗余检验 Cyclic Redundancy Check (CRC) public class CRC { private int[] generatingCode; // 生成码 // 设置生成码 public void setGeneratingCode(String str) { generatingCode = stringToArray(str); } // 获取帧检验序列 public String getFCS(String message) { for (int i = 0; i < generatingCode.length - 1; i++) { message += "0"; } return getRemainder(stringToArray(message)); } // 判断接受码是否产生跳变 public boolean judge(String res) { return Integer.parseInt(getRemainder(stringToArray(res))) == 0; } // 将01字符串转换为数组 private int[] stringToArray(String str) { char[] chars = str.toCharArray(); int[] res = new int[chars.length]; for (int i = 0; i < chars.length; i++) { res[i] = chars[i] - '0'; } return res; } // 求余数 private String getRemainder(int[] code) { int len = code.length - generatingCode.length + 1; for (int i = 0; i < len; i++) { if (code[i] != 0) { for (int j = 0; j < generatingCode.length; j++) { code[i + j] ^= generatingCode[j]; } } } StringBuilder res = new StringBuilder(); for (int i = len; i < code.length; i++) { res.append(code[i]); } return res.toString(); } } class TestCRC { public static void main(String[] args) { CRC crc = new CRC(); crc.setGeneratingCode("10011"); System.out.println(crc.getFCS("1101011011")); // 1110 System.out.println(crc.judge("11010110111110")); // true System.out.println(crc.judge("11010110111011")); // false } }