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);
        }