From 487a5b943571d6ab57c4baddca1cbcc7b2062e73 Mon Sep 17 00:00:00 2001 From: 826220679@qq.com <826220679@qq.com> Date: 星期三, 27 八月 2025 23:06:57 +0800 Subject: [PATCH] 20250827 --- src/home/Dell55AA1FParser.java | 36 +++++++++++++++++++++++++++++------- 1 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/home/Dell55AA1FParser.java b/src/home/Dell55AA1FParser.java index ad2cdf4..31f2104 100644 --- a/src/home/Dell55AA1FParser.java +++ b/src/home/Dell55AA1FParser.java @@ -4,6 +4,7 @@ public class Dell55AA1FParser { // 常量定义 private static final String EXPECTED_HEADER = "55AA1F"; // 协议头 + private static final int MIN_PACKET_LENGTH = 36; // 最小包长度(字符数): 固定字段18字节=36字符 private static final int FIXED_FIELDS_LENGTH = 11; // 从标签ID到保留字段的固定长度(字节) private static final ThreadLocal<ParseResult> RESULT_CACHE = ThreadLocal.withInitial(ParseResult::new); @@ -44,6 +45,7 @@ */ public static ParseResult parse(String message, String ip, int port) { if (message == null || message.isEmpty()) { + System.err.println("Empty message from " + ip + ":" + port); return null; } @@ -51,12 +53,22 @@ char[] cleanedMessage = cleanMessage(message); if (cleanedMessage == null) { + System.err.println("Invalid characters in message from " + ip + ":" + port); + return null; + } + + // 检查最小长度 + if (cleanedMessage.length < MIN_PACKET_LENGTH) { + System.err.println("Message too short from " + ip + ":" + port + + ". Expected at least " + MIN_PACKET_LENGTH + + " characters, got " + cleanedMessage.length); return null; } // 协议头校验 (55AA1F) if (cleanedMessage.length < 6 || !new String(cleanedMessage, 0, 6).equals(EXPECTED_HEADER)) { + System.err.println("Invalid header in message from " + ip + ":" + port); return null; } @@ -68,13 +80,12 @@ result.dataLength = HexUtils.fastHexToByte(cleanedMessage[6], cleanedMessage[7]); // 计算期望的总字符长度 - int expectedCharLength = 8 + // 包头(4字符) + 消息类型(2字符) + 数据长度(2字符) - result.dataLength * 2 + // 数据部分 - 4; // 校验和(4字符) + int expectedCharLength = 14 + result.dataLength * 2; // 14=包头6+消息类型2+数据长度2+校验和4 -// if (cleanedMessage.length != expectedCharLength) { -// System.err.println("Data length mismatch: expected " + expectedCharLength + -// ", got " + cleanedMessage.length); +// if (cleanedMessage.length < expectedCharLength) { +// System.err.println("Incomplete message from " + ip + ":" + port + +// ". Expected " + expectedCharLength + +// " characters, got " + cleanedMessage.length); // return null; // } @@ -83,6 +94,12 @@ // 解析标签ID (位置8-11),直接取字符串 result.tagId = new String(cleanedMessage, 8, 4); + + // 检查是否有足够长度解析固定字段 + if (cleanedMessage.length < 30) { // 需要至少15字节=30字符 + System.err.println("Message too short for fixed fields from " + ip + ":" + port); + return null; + } // 解析距离 (位置12-15, 2字节小端整数) int distLow = HexUtils.fastHexToByte(cleanedMessage[12], cleanedMessage[13]); @@ -111,7 +128,12 @@ // int userDataStart = 30; // int userDataCharLength = (result.dataLength - FIXED_FIELDS_LENGTH) * 2; // if (userDataCharLength > 0) { -// result.userData = new String(cleanedMessage, userDataStart, userDataCharLength); +// if (userDataStart + userDataCharLength <= cleanedMessage.length) { +// result.userData = new String(cleanedMessage, userDataStart, userDataCharLength); +// } else { +// System.err.println("User data truncated in message from " + ip + ":" + port); +// result.userData = ""; +// } // } else { // result.userData = ""; // } -- Gitblit v1.9.3