From 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf Mon Sep 17 00:00:00 2001
From: zsh_root <979909237@qq.com>
Date: 星期三, 10 十二月 2025 17:03:47 +0800
Subject: [PATCH] 发布版V1.0
---
src/home/PacketParser.java | 144 +++++++++++++++++++++++------------------------
1 files changed, 70 insertions(+), 74 deletions(-)
diff --git a/src/home/PacketParser.java b/src/home/PacketParser.java
index 04e28ac..1465554 100644
--- a/src/home/PacketParser.java
+++ b/src/home/PacketParser.java
@@ -1,33 +1,34 @@
package home;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
-// 重命名为PacketParser,表示数据包解析器
+// 閲嶅懡鍚嶄负PacketParser锛岃〃绀烘暟鎹寘瑙f瀽鍣�
public class PacketParser {
- // 添加十六进制字符数组常量
+ // 娣诲姞鍗佸叚杩涘埗瀛楃鏁扮粍甯搁噺
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
- // 缓冲区字节数组
+ // 缂撳啿鍖哄瓧鑺傛暟缁�
private byte[] buffer = new byte[4096];
- // 当前缓冲区有效数据长度
+ // 褰撳墠缂撳啿鍖烘湁鏁堟暟鎹暱搴�
private int bufferLength = 0;
- // 追加新数据到缓冲区
+ // 杩藉姞鏂版暟鎹埌缂撳啿鍖�
public void appendData(byte[] newData, int length) {
- // 检查缓冲区是否足够
+ // 妫�鏌ョ紦鍐插尯鏄惁瓒冲
if (bufferLength + length > buffer.length) {
- // 创建新的更大缓冲区
+ // 鍒涘缓鏂扮殑鏇村ぇ缂撳啿鍖�
byte[] newBuffer = new byte[bufferLength + length];
- // 复制原有数据
+ // 澶嶅埗鍘熸湁鏁版嵁
System.arraycopy(buffer, 0, newBuffer, 0, bufferLength);
buffer = newBuffer;
}
- // 追加新数据
+ // 杩藉姞鏂版暟鎹�
System.arraycopy(newData, 0, buffer, bufferLength, length);
- // 更新缓冲区长度
+ // 鏇存柊缂撳啿鍖洪暱搴�
bufferLength += length;
}
- // 新增方法:字节数组转十六进制字符串
+ // 鏂板鏂规硶锛氬瓧鑺傛暟缁勮浆鍗佸叚杩涘埗瀛楃涓�
public static String bytesToHexString(byte[] bytes) {
if (bytes == null) return "";
char[] hexChars = new char[bytes.length * 2];
@@ -39,73 +40,73 @@
return new String(hexChars);
}
- // 解析缓冲区中的所有完整数据包
+ // 瑙f瀽缂撳啿鍖轰腑鐨勬墍鏈夊畬鏁存暟鎹寘
public List<DataPacket> parsePackets() {
List<DataPacket> packets = new ArrayList<>();
- int index = 0; // 当前解析位置索引
+ int index = 0; // 褰撳墠瑙f瀽浣嶇疆绱㈠紩
- // 遍历缓冲区查找完整数据包
- while (index <= bufferLength - 4) { // 确保有足够数据检查包头
- // 检查包头标识 0x55 0xAA
+ // 閬嶅巻缂撳啿鍖烘煡鎵惧畬鏁存暟鎹寘
+ while (index <= bufferLength - 4) { // 纭繚鏈夎冻澶熸暟鎹鏌ュ寘澶�
+ // 妫�鏌ュ寘澶存爣璇� 0x55 0xAA
if (buffer[index] == 0x55 && (buffer[index + 1] & 0xFF) == 0xAA) {
- // 获取包类型(第3字节)
+ // 鑾峰彇鍖呯被鍨嬶紙绗�3瀛楄妭锛�
int packetType = buffer[index + 2] & 0xFF;
- // 获取数据长度(第4字节)
+ // 鑾峰彇鏁版嵁闀垮害锛堢4瀛楄妭锛�
int dataLenField = buffer[index + 3] & 0xFF;
- // 计算完整包长度(包头+数据+校验)
- int totalPacketLen = 2 + dataLenField + 2; // 增加2字节校验位
+ // 璁$畻瀹屾暣鍖呴暱搴︼紙鍖呭ご+鏁版嵁+鏍¢獙锛�
+ int totalPacketLen = 2 + dataLenField + 2; // 澧炲姞2瀛楄妭鏍¢獙浣�
- // 检查是否有足够数据构成完整包
+ // 妫�鏌ユ槸鍚︽湁瓒冲鏁版嵁鏋勬垚瀹屾暣鍖�
if (index + totalPacketLen > bufferLength) {
- break; // 数据不足,等待更多数据
+ break; // 鏁版嵁涓嶈冻锛岀瓑寰呮洿澶氭暟鎹�
}
- // 提取完整数据包
+ // 鎻愬彇瀹屾暣鏁版嵁鍖�
byte[] packetData = new byte[totalPacketLen];
System.arraycopy(buffer, index, packetData, 0, totalPacketLen);
- // 验证校验和
+ // 楠岃瘉鏍¢獙鍜�
if (verifyChecksum(packetData)) {
- // 解析单个数据包
+ // 瑙f瀽鍗曚釜鏁版嵁鍖�
DataPacket packet = parseSinglePacket(packetType, packetData);
if (packet != null) {
- packets.add(packet); // 添加到结果列表
+ packets.add(packet); // 娣诲姞鍒扮粨鏋滃垪琛�
}
- index += totalPacketLen; // 移动到下一个包
+ index += totalPacketLen; // 绉诲姩鍒颁笅涓�涓寘
} else {
- index++; // 校验失败,跳过当前字节
+ index++; // 鏍¢獙澶辫触锛岃烦杩囧綋鍓嶅瓧鑺�
}
} else {
- index++; // 非包头标识,继续查找
+ index++; // 闈炲寘澶存爣璇嗭紝缁х画鏌ユ壘
}
}
- // 清理已处理数据
+ // 娓呯悊宸插鐞嗘暟鎹�
if (index > 0) {
int remaining = bufferLength - index;
if (remaining > 0) {
- // 移动剩余数据到缓冲区开头
+ // 绉诲姩鍓╀綑鏁版嵁鍒扮紦鍐插尯寮�澶�
System.arraycopy(buffer, index, buffer, 0, remaining);
}
- bufferLength = remaining; // 更新缓冲区长度
+ bufferLength = remaining; // 鏇存柊缂撳啿鍖洪暱搴�
}
return packets;
}
- // 校验数据包
+ // 鏍¢獙鏁版嵁鍖�
private boolean verifyChecksum(byte[] packet) {
int len = packet.length;
if (len < 4) return false;
int sum = 0;
- // 从数据类型开始到校验码前结束 (包头2字节已跳过)
+ // 浠庢暟鎹被鍨嬪紑濮嬪埌鏍¢獙鐮佸墠缁撴潫 (鍖呭ご2瀛楄妭宸茶烦杩�)
for (int i = 2; i < len - 2; i++) {
sum += packet[i] & 0xFF;
}
- sum = ~sum & 0xFFFF; // 取反并保留16位
+ sum = ~sum & 0xFFFF; // 鍙栧弽骞朵繚鐣�16浣�
- // 获取包中的校验码 (小端模式)
+ // 鑾峰彇鍖呬腑鐨勬牎楠岀爜 (灏忕妯″紡)
int receivedChecksum = ((packet[len - 1] & 0xFF) << 8) | (packet[len - 2] & 0xFF);
return sum == receivedChecksum;
@@ -113,17 +114,17 @@
- // 解析单个数据包
+ // 瑙f瀽鍗曚釜鏁版嵁鍖�
private DataPacket parseSinglePacket(int packetType, byte[] packet) {
- // 创建数据包对象(包含包类型)
+ // 鍒涘缓鏁版嵁鍖呭璞★紙鍖呭惈鍖呯被鍨嬶級
return new DataPacket(packetType, packet);
}
- // 数据包内部类
+ // 鏁版嵁鍖呭唴閮ㄧ被
public static class DataPacket {
- private final int packetType; // 包类型
- private final byte[] packet;//包数据
+ private final int packetType; // 鍖呯被鍨�
+ private final byte[] packet;//鍖呮暟鎹�
public DataPacket(int packetType, byte[] packet) {
@@ -131,89 +132,84 @@
this.packet = packet;
}
- // 获取包类型
+ // 鑾峰彇鍖呯被鍨�
public int getPacketType() {
return packetType;
}
- // 包数据
+ // 鍖呮暟鎹�
public byte[] getPacket() {
return packet;
}
}
- // HEX字符串转字节数组
+ // HEX瀛楃涓茶浆瀛楄妭鏁扮粍
public static byte[] hexStringToBytes(String hex) {
- // 移除空格
+ // 绉婚櫎绌烘牸
hex = hex.replaceAll("\\s", "");
int len = hex.length();
- // 创建结果数组
+ // 鍒涘缓缁撴灉鏁扮粍
byte[] data = new byte[len / 2];
- // 每两个字符转换一个字节
+ // 姣忎袱涓瓧绗﹁浆鎹竴涓瓧鑺�
for (int i = 0; i < len; i += 2) {
- // 高位转换
+ // 楂樹綅杞崲
int high = Character.digit(hex.charAt(i), 16) << 4;
- // 低位转换
+ // 浣庝綅杞崲
int low = Character.digit(hex.charAt(i + 1), 16);
data[i / 2] = (byte) (high | low);
}
return data;
}
-
-
- /**输出校验码*/
+
+
+ /**杈撳嚭鏍¢獙鐮�*/
public static String calculateChecksum(String input) {
- // 检查输入是否为空
+ // 妫�鏌ヨ緭鍏ユ槸鍚︿负绌�
if (input == null) {
- throw new IllegalArgumentException("输入不能为null");
+ throw new IllegalArgumentException("杈撳叆涓嶈兘涓簄ull");
}
-
- // 移除所有空格
+ // 绉婚櫎鎵�鏈夌┖鏍�
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);
}
- /** 将字节数组转为十六进制字符串,例如 [55 AA 01 02 ...] */
+ /** 灏嗗瓧鑺傛暟缁勮浆涓哄崄鍏繘鍒跺瓧绗︿覆锛屼緥濡� [55 AA 01 02 ...] */
private static String bytesToHex(byte[] bytes) {
if (bytes == null) return "null";
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (byte b : bytes) {
sb.append(String.format("%02X ", b & 0xFF));
}
- // 去掉最后一个空格
+ // 鍘绘帀鏈�鍚庝竴涓┖鏍�
return sb.substring(0, sb.length() - 1);
}
--
Gitblit v1.10.0