private static void ParseBuffer(RecvState state, int dataLength) { if (dataLength == 0) { return; } byte[] workingBuf; if (state.m_PrevLeftoverBuf != null) { workingBuf = new byte[dataLength + state.m_PrevLeftoverBuf.Length]; Buffer.BlockCopy(state.m_PrevLeftoverBuf, 0, workingBuf, 0, state.m_PrevLeftoverBuf.Length); Buffer.BlockCopy(state.m_buf, 0, workingBuf, state.m_PrevLeftoverBuf.Length, dataLength); state.m_PrevLeftoverBuf = null; dataLength = workingBuf.Length; } else { workingBuf = state.m_buf; } int expectedTotalPacketLen = 0; int packetLenBytes = 0; for (int i = 0; i < dataLength;) { /********************************************************************/ // Read packet length /********************************************************************/ packetLenBytes = 1; state.m_bytesLenBuf = 1; expectedTotalPacketLen = workingBuf[i] & 0x7F; while ((workingBuf[i] & 0x80) == 0x80) { i++; if (i < dataLength) { expectedTotalPacketLen <<= 7; expectedTotalPacketLen += workingBuf[i] & 0x7F; packetLenBytes++; state.m_bytesLenBuf = packetLenBytes; } else { state.m_PrevLeftoverBuf = new byte[packetLenBytes]; Buffer.BlockCopy(workingBuf, i - packetLenBytes, state.m_PrevLeftoverBuf, 0, packetLenBytes); StartRecvPacket(state); return; } } /********************************************************************/ // End Read packet length /********************************************************************/ i++; int packetBytesRecived = Math.Min(expectedTotalPacketLen, dataLength - i); if (packetBytesRecived < expectedTotalPacketLen) { state.m_PrevLeftoverBuf = new byte[packetBytesRecived + packetLenBytes]; Array.Copy(workingBuf, i - packetLenBytes, state.m_PrevLeftoverBuf, 0, packetBytesRecived + packetLenBytes); if (!state.m_recvLoop) { state.m_buf = new byte[expectedTotalPacketLen - packetBytesRecived]; } state.m_OnRecvProgress?.Invoke(packetBytesRecived, expectedTotalPacketLen); StartRecvPacket(state); return; } byte[] data = new byte[packetBytesRecived]; Array.Copy(workingBuf, i, data, 0, packetBytesRecived); state.m_OnRecv(data, data.Length + state.m_bytesLenBuf); i += packetBytesRecived; } if (state.m_recvLoop) { StartRecvPacket(state); } }