public unsafe MarkupType SyncHeader(int received) { MarkupType noiseKind = MarkupType.None; lock (binReceive) { int offset = 0, length = received; bool inprogress = false; if (SerialPacketSize == 0) { SerialPacketSize = *((int *)(headerBufferAddress + 4).ToPointer()); DeserialPacketId = *((int *)(headerBufferAddress + 12).ToPointer()); binReceive = new byte[SerialPacketSize]; GCHandle gc = GCHandle.Alloc(binReceive, GCHandleType.Pinned); binReceiveHandler = GCHandle.ToIntPtr(gc); binReceiveAddress = gc.AddrOfPinnedObject(); offset = SerialPacketOffset; length -= SerialPacketOffset; } if (SerialPacketSize > 0) { inprogress = true; } SerialPacketSize -= length; if (SerialPacketSize < 1) { long endPosition = length; noiseKind = HeaderBuffer.SeekMarkup(out endPosition, SeekDirection.Backward); } int destid = (int)(binReceive.Length - (SerialPacketSize + length)); if (inprogress) { Extractor.CopyBlock(binReceiveAddress, destid, headerBufferAddress, offset, length); } } return(noiseKind); }