List <byte[]> SplitPacketBuffer(byte[] dataBuffer) { List <byte[]> list = new List <byte[]>(); int headerPos = 0; for (; ;) { if (pos <= headerPos + Marshal.SizeOf(typeof(EnvPacketHeader))) { break; } headerPos = FindHeader(); if (-1 == headerPos) { Array.Copy(dataBuffer, pos - Marshal.SizeOf(typeof(EnvPacketHeader)), dataBuffer, 0, Marshal.SizeOf(typeof(EnvPacketHeader))); pos = Marshal.SizeOf(typeof(EnvPacketHeader)); break; } EnvPacketHeader header = Tool.ByteToStruct <EnvPacketHeader>(dataBuffer, headerPos, Marshal.SizeOf(typeof(EnvPacketHeader))); int packetLen = 0; switch ((EnvProtocol.DataType)header.dataType) { case EnvProtocol.DataType.DataTypeSlow: packetLen = Marshal.SizeOf(typeof(EnvPacketHeader)) + Marshal.SizeOf(typeof(SlowPacket)); break; case EnvProtocol.DataType.DataTypeFast: packetLen = Marshal.SizeOf(typeof(EnvPacketHeader)) + Marshal.SizeOf(typeof(FastPacket)); break; case EnvProtocol.DataType.DataTypeTail: packetLen = Marshal.SizeOf(typeof(EnvPacketHeader)) + Marshal.SizeOf(typeof(TailPacketUdp)); break; default: break; } if (packetLen != 0 && headerPos + packetLen <= pos) { byte[] protocolData = new byte[packetLen]; Array.Copy(dataBuffer, headerPos, protocolData, 0, packetLen); int contentHeaderPos = FindHeader(protocolData.Skip(Marshal.SizeOf(typeof(EnvPacketHeader))).ToArray()); if (contentHeaderPos == -1) { list.Add(protocolData); Array.Copy(dataBuffer, headerPos + packetLen, dataBuffer, 0, pos - headerPos - packetLen); pos -= (headerPos + packetLen); headerPos = 0; } else { Array.Copy(dataBuffer, headerPos + contentHeaderPos, dataBuffer, 0, pos - headerPos - contentHeaderPos); pos -= (headerPos + contentHeaderPos); headerPos = 0; } } else { break; } } return(list); }
private void ParseData(byte[] buffer) { if (buffer.Length <= Marshal.SizeOf(typeof(EnvPacketHeader))) { return; } EnvPacketHeader header = Tool.ByteToStruct <EnvPacketHeader>(buffer, 0, Marshal.SizeOf(typeof(EnvPacketHeader))); if (!Enumerable.SequenceEqual(header.syncHeader, EnvProtocol.SyncHeader)) { return; } byte[] body = new byte[buffer.Length - Marshal.SizeOf(typeof(EnvPacketHeader))]; Array.Copy(buffer, Marshal.SizeOf(typeof(EnvPacketHeader)), body, 0, body.Length); switch ((EnvProtocol.DataType)header.dataType) { case EnvProtocol.DataType.DataTypeSlow: SlowPacket slowPacket; if (SlowParser.Parse(body, out slowPacket)) { IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SlowPacket))); Marshal.StructureToPtr(slowPacket, ptr, true); WinApi.PostMessage(mainWindowHandle, WinApi.WM_SLOW_DATA, 0, ptr); } else { WinApi.PostMessage(mainWindowHandle, WinApi.WM_SLOW_DATA, 0, IntPtr.Zero); } if (IsStartLogData) { dataLogger.WriteSlowPacket(buffer); } break; case EnvProtocol.DataType.DataTypeFast: FastPacket fastPacket; if (FastParser.Parse(body, out fastPacket)) { IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FastPacket))); Marshal.StructureToPtr(fastPacket, ptr, true); WinApi.PostMessage(mainWindowHandle, WinApi.WM_FAST_DATA, 0, ptr); } else { WinApi.PostMessage(mainWindowHandle, WinApi.WM_FAST_DATA, 0, IntPtr.Zero); } if (IsStartLogData) { dataLogger.WriteFastPacket(buffer); } break; case EnvProtocol.DataType.DataTypeTail: List <TailPacketRs> tailPacketRs = tailParser.Parse(body); if (tailPacketRs.Count > 0) { foreach (TailPacketRs packet in tailPacketRs) { IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TailPacketRs))); Marshal.StructureToPtr(packet, ptr, true); WinApi.PostMessage(mainWindowHandle, WinApi.WM_TAIL_DATA, 0, ptr); } } else { WinApi.PostMessage(mainWindowHandle, WinApi.WM_TAIL_DATA, 0, IntPtr.Zero); } if (IsStartLogData) { dataLogger.WriteTailPacket(buffer); } break; default: break; } }