Example #1
0
        public override int Encode(Span <byte> buffer)
        {
            if (ProtocolString is null || InfoHash is null || PeerId is null)
            {
                throw new InvalidOperationException();
            }

            int written = buffer.Length;

            Write(ref buffer, (byte)ProtocolString.Length);
            WriteAscii(ref buffer, ProtocolString);

            Span <byte> supports = stackalloc byte[8];

            supports.Clear();

            if (SupportsExtendedMessaging)
            {
                supports[5] |= ExtendedMessagingFlag;
            }
            if (SupportsFastPeer)
            {
                supports[7] |= FastPeersFlag;
            }
            supports.CopyTo(buffer);
            buffer = buffer.Slice(supports.Length);

            Write(ref buffer, InfoHash.Truncate().Span);
            Write(ref buffer, PeerId.Span);

            return(written - buffer.Length);
        }