diff --git a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart index ac3e8a2f..35412daf 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart @@ -189,40 +189,65 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle } Future> _processCompletePayload(Uint8List payload) async { - // 存储找到的所有完整帧 List frames = []; + int startIdx = -1; + final length = payload.length - 1; - // 手动遍历 payload - int i = 0; - while (i < payload.length - 1) { - // 寻找起始标志 0xFFD8 - if (payload[i] == 0xFF && payload[i + 1] == 0xD8) { - int startIdx = i; - i += 2; // 跳过起始标志 + for (int i = 0; i < length; i++) { + final currentByte = payload[i]; + final nextByte = payload[i + 1]; - // 寻找结束标志 0xFFD9 - while (i < payload.length - 1) { - if (payload[i] == 0xFF && payload[i + 1] == 0xD9) { - // 找到结束标志 0xFFD9 - int endIdx = i + 2; - // 使用 Uint8List.view 创建视图,避免内存分配 - frames.add( - Uint8List.view(payload.buffer, startIdx, endIdx - startIdx)); - i = endIdx; // 继续寻找下一个帧 - break; - } else { - i += 1; // 继续寻找结束标志 - } + if (currentByte == 0xFF) { + if (nextByte == 0xD8) { + startIdx = i; + i++; // Skip the next byte + } else if (nextByte == 0xD9 && startIdx != -1) { + frames + .add(Uint8List.view(payload.buffer, startIdx, i + 2 - startIdx)); + startIdx = -1; + i++; // Skip the next byte } - } else { - i += 1; // 继续寻找起始标志 } } - // 返回找到的所有完整帧 return frames; } +// Future> _processCompletePayload(Uint8List payload) async { +// // 存储找到的所有完整帧 +// List frames = []; +// +// // 手动遍历 payload +// int i = 0; +// while (i < payload.length - 1) { +// // 寻找起始标志 0xFFD8 +// if (payload[i] == 0xFF && payload[i + 1] == 0xD8) { +// int startIdx = i; +// i += 2; // 跳过起始标志 +// +// // 寻找结束标志 0xFFD9 +// while (i < payload.length - 1) { +// if (payload[i] == 0xFF && payload[i + 1] == 0xD9) { +// // 找到结束标志 0xFFD9 +// int endIdx = i + 2; +// // 使用 Uint8List.view 创建视图,避免内存分配 +// frames.add( +// Uint8List.view(payload.buffer, startIdx, endIdx - startIdx)); +// i = endIdx; // 继续寻找下一个帧 +// break; +// } else { +// i += 1; // 继续寻找结束标志 +// } +// } +// } else { +// i += 1; // 继续寻找起始标志 +// } +// } +// +// // 返回找到的所有完整帧 +// return frames; +// } + // Future> _processCompletePayload(Uint8List payload) async { // // 存储找到的所有完整帧 // List frames = [];