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