zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
src/home/Checksum.java
@@ -1,41 +1,41 @@
package home;
public class Checksum {
   /**输出校验码*/
   /**输出校验码*/
   public static String calculateChecksum(String input) {      
      if (input == null) {// 检查输入是否为空
         throw new IllegalArgumentException("输入不能为null");
      if (input == null) {// 检查输入是否为空
         throw new IllegalArgumentException("输入不能为null");
      }
      String cleanInput = input.replaceAll("\\s", "");// 移除所有空格
      String cleanInput = input.replaceAll("\\s", "");// 移除所有空格
      // 验证处理后的字符串
      // 验证处理后的字符串
      if (cleanInput.length() < 8 || !cleanInput.startsWith("55AA")) {
         throw new IllegalArgumentException("输入字符串必须以55AA开头且长度至少为8(去除空格后)");
         throw new IllegalArgumentException("输入字符串必须以55AA开头且长度至少为8(去除空格后)");
      }
      // 去掉包头(55AA)和最后4个字符
      // 去掉包头(55AA)和最后4个字符
      String dataPart = cleanInput.substring(4, cleanInput.length() - 4);
      // 检查中间部分长度是否为偶数
      // 检查中间部分长度是否为偶数
      if (dataPart.length() % 2 != 0) {
         throw new IllegalArgumentException("中间部分长度必须是偶数(去除空格后)");
         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位范围
         sum = (sum + byteValue) & 0xFFFF; // 保持16位范围
      }
      // 取反并保持16位
      // 取反并保持16位
      int checksum = (~sum) & 0xFFFF;
      // 显式处理高位在前格式
      int  lowByte= (checksum >>> 8) & 0xFF;  // 高8位
      int  highByte= checksum & 0xFF;           // 低8位
      // 显式处理高位在前格式
      int  lowByte= (checksum >>> 8) & 0xFF;  // 高8位
      int  highByte= checksum & 0xFF;           // 低8位
      // 格式化为4位十六进制字符串(大写),高位在前
      // 格式化为4位十六进制字符串(大写),高位在前
      
      return String.format("%02X%02X", highByte, lowByte);
   }