コード例 #1
0
        private static bool TryGetBufferedLengthPrefixedString(
            Utf8Memory stringToken,
            out Utf8Memory value)
        {
            ReadOnlySpan <byte> stringTokenSpan = stringToken.Memory.Span;
            byte typeMarker = stringTokenSpan[0];

            stringTokenSpan = stringTokenSpan.Slice(start: 1);

            int  start;
            long length;

            if (JsonBinaryEncoding.TypeMarker.IsEncodedLengthString(typeMarker))
            {
                start  = JsonBinaryEncoding.TypeMarkerLength;
                length = JsonBinaryEncoding.GetStringLengths(typeMarker);
            }
            else
            {
                switch (typeMarker)
                {
                case JsonBinaryEncoding.TypeMarker.String1ByteLength:
                    if (stringTokenSpan.Length < JsonBinaryEncoding.OneByteLength)
                    {
                        value = default;
                        return(false);
                    }

                    start  = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.OneByteLength;
                    length = stringTokenSpan[0];
                    break;

                case JsonBinaryEncoding.TypeMarker.String2ByteLength:
                    if (stringTokenSpan.Length < JsonBinaryEncoding.TwoByteLength)
                    {
                        value = default;
                        return(false);
                    }

                    start  = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.TwoByteLength;
                    length = MemoryMarshal.Read <ushort>(stringTokenSpan);
                    break;

                case JsonBinaryEncoding.TypeMarker.String4ByteLength:
                    if (stringTokenSpan.Length < JsonBinaryEncoding.FourByteLength)
                    {
                        value = default;
                        return(false);
                    }

                    start  = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.FourByteLength;
                    length = MemoryMarshal.Read <uint>(stringTokenSpan);
                    break;

                default:
                    value = default;
                    return(false);
                }

                if ((start + length) > stringToken.Length)
                {
                    value = default;
                    return(false);
                }
            }

            value = stringToken.Slice(start: start, length: (int)length);
            return(true);
        }