Ejemplo n.º 1
0
        private (int, ReadOnlyMemory <byte>) WriteMessageSize()
        {
            // Message size is written as protobuf base 128 varint.
            // https://developers.google.com/protocol-buffers/docs/encoding#varints

            int messageSize = _buffer.WrittenCount;
            int varint      = messageSize;

            const int   maxVarintSize = 5;
            Span <byte> buff          = stackalloc byte[maxVarintSize];

            const int base128Mask = 0x7F;
            const int highBit     = 0x80;
            int       varintLen   = 0;

            while (true)
            {
                buff[varintLen] = (byte)(varint & base128Mask);
                varint        >>= 7;

                if (varint == 0)
                {
                    break;
                }

                buff[varintLen] |= highBit;
                ++varintLen;
            }

            ++varintLen;

            _buffer.Write(buff.Slice(0, varintLen));

            return(messageSize, _buffer.WrittenMemory.Slice(messageSize, varintLen));
        }
Ejemplo n.º 2
0
 /// <inheritdoc/>
 void ICollection <T> .CopyTo(T[] array, int arrayIndex)
 => WrittenMemory.CopyTo(array.AsMemory(arrayIndex));