private JsonEncodedText(byte[] utf8Value) { Debug.Assert(utf8Value != null); _value = JsonReaderHelper.GetTextFromUtf8(utf8Value); _utf8Value = utf8Value; }
public static string FormatDateTime(DateTime value) { Span <byte> span = stackalloc byte[JsonConstants.MaximumFormatDateTimeOffsetLength]; JsonWriterHelper.WriteDateTimeTrimmed(span, value, out int bytesWritten); return(JsonReaderHelper.GetTextFromUtf8(span.Slice(0, bytesWritten))); }
private static void EscapeString(ReadOnlySpan <char> value, Span <char> destination, JavaScriptEncoder encoder, ref int written) { // todo: issue #39523: add an Encode(ReadOnlySpan<char>) decode API to System.Text.Encodings.Web.TextEncoding to avoid utf16->utf8->utf16 conversion. Debug.Assert(encoder != null); // Convert char to byte. byte[] utf8DestinationArray = null; Span <byte> utf8Destination; int length = checked ((value.Length) * JsonConstants.MaxExpansionFactorWhileTranscoding); if (length > JsonConstants.StackallocThreshold) { utf8DestinationArray = ArrayPool <byte> .Shared.Rent(length); utf8Destination = utf8DestinationArray; } else { unsafe { byte *ptr = stackalloc byte[JsonConstants.StackallocThreshold]; utf8Destination = new Span <byte>(ptr, JsonConstants.StackallocThreshold); } } ReadOnlySpan <byte> utf16Value = MemoryMarshal.AsBytes(value); OperationStatus toUtf8Status = ToUtf8(utf16Value, utf8Destination, out int bytesConsumed, out int bytesWritten); Debug.Assert(toUtf8Status != OperationStatus.DestinationTooSmall); Debug.Assert(toUtf8Status != OperationStatus.NeedMoreData); if (toUtf8Status != OperationStatus.Done) { if (utf8DestinationArray != null) { utf8Destination.Slice(0, bytesWritten).Clear(); ArrayPool <byte> .Shared.Return(utf8DestinationArray); } ThrowHelper.ThrowArgumentException_InvalidUTF8(utf16Value.Slice(bytesWritten)); } Debug.Assert(toUtf8Status == OperationStatus.Done); Debug.Assert(bytesConsumed == utf16Value.Length); // Escape the bytes. byte[] utf8ConvertedDestinationArray = null; Span <byte> utf8ConvertedDestination; length = checked (bytesWritten * JsonConstants.MaxExpansionFactorWhileEscaping); if (length > JsonConstants.StackallocThreshold) { utf8ConvertedDestinationArray = ArrayPool <byte> .Shared.Rent(length); utf8ConvertedDestination = utf8ConvertedDestinationArray; } else { unsafe { byte *ptr = stackalloc byte[JsonConstants.StackallocThreshold]; utf8ConvertedDestination = new Span <byte>(ptr, JsonConstants.StackallocThreshold); } } EscapeString(utf8Destination.Slice(0, bytesWritten), utf8ConvertedDestination, indexOfFirstByteToEscape: 0, encoder, out int convertedBytesWritten); if (utf8DestinationArray != null) { utf8Destination.Slice(0, bytesWritten).Clear(); ArrayPool <byte> .Shared.Return(utf8DestinationArray); } // Convert byte to char. #if BUILDING_INBOX_LIBRARY OperationStatus toUtf16Status = Utf8.ToUtf16(utf8ConvertedDestination.Slice(0, convertedBytesWritten), destination, out int bytesRead, out int charsWritten); Debug.Assert(toUtf16Status == OperationStatus.Done); Debug.Assert(bytesRead == convertedBytesWritten); #else string utf16 = JsonReaderHelper.GetTextFromUtf8(utf8ConvertedDestination.Slice(0, convertedBytesWritten)); utf16.AsSpan().CopyTo(destination); int charsWritten = utf16.Length; #endif written += charsWritten; if (utf8ConvertedDestinationArray != null) { utf8ConvertedDestination.Slice(0, written).Clear(); ArrayPool <byte> .Shared.Return(utf8ConvertedDestinationArray); } }