package home; 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="55AA03070204020320FFFF"; // calculateChecksum(input); // } }