package PublicPannel; public class Checksum { /**输出校验码*/ public static String calculateChecksum(String input) { if (input == null) {// 检查输入是否为空 throw new IllegalArgumentException("输入不能为null"); } String cleanInput = input.replaceAll("\\s", "");// 移除所有空格 // 验证处理后的字符串 if (cleanInput.length() < 8 || !cleanInput.startsWith("55AA")) { throw new IllegalArgumentException("输入字符串必须以55AA开头且长度至少为8(去除空格后)"); } // 去掉包头(55AA)和最后4个字符 String dataPart = cleanInput.substring(4, cleanInput.length() - 4); // 检查中间部分长度是否为偶数 if (dataPart.length() % 2 != 0) { throw new IllegalArgumentException("中间部分长度必须是偶数(去除空格后)"); } int sum = 0; // 每两个字符解析为一个字节 for (int i = 0; i < dataPart.length(); i += 2) { String byteStr = dataPart.substring(i, i + 2); int byteValue = Integer.parseInt(byteStr, 16); sum = (sum + byteValue) & 0xFFFF; // 保持16位范围 } // 取反并保持16位 int checksum = (~sum) & 0xFFFF; // 显式处理高位在前格式 int lowByte= (checksum >>> 8) & 0xFF; // 高8位 int highByte= checksum & 0xFF; // 低8位 // 格式化为4位十六进制字符串(大写),高位在前 return String.format("%02X%02X", highByte, lowByte); } // public static void main(String args[]) { // String input="55AA03060102800076FF"; // calculateChecksum(input); // } }