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);
|
// }
|
}
|