zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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);
//  }
}