Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ ToUtf16()

static unsafe OperationStatus System.Text.Unicode.Utf8.ToUtf16 ( ReadOnlySpan< byte > source,
Span< char > destination,
out int bytesRead,
out int charsWritten,
bool replaceInvalidSequences = true,
bool isFinalBlock = true )
inlinestatic

Definition at line 54 of file Utf8.cs.

55 {
56 _ = source.Length;
57 _ = destination.Length;
58 fixed (byte* ptr = &MemoryMarshal.GetReference(source))
59 {
60 fixed (char* ptr2 = &MemoryMarshal.GetReference(destination))
61 {
62 OperationStatus operationStatus = OperationStatus.Done;
63 byte* pInputBufferRemaining = ptr;
64 char* pOutputBufferRemaining = ptr2;
65 while (!source.IsEmpty)
66 {
67 operationStatus = Utf8Utility.TranscodeToUtf16((byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source)), source.Length, (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination)), destination.Length, out pInputBufferRemaining, out pOutputBufferRemaining);
68 if (operationStatus <= OperationStatus.DestinationTooSmall || (operationStatus == OperationStatus.NeedMoreData && !isFinalBlock))
69 {
70 break;
71 }
72 if (!replaceInvalidSequences)
73 {
74 operationStatus = OperationStatus.InvalidData;
75 break;
76 }
77 destination = destination.Slice((int)(pOutputBufferRemaining - (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination))));
78 if (destination.IsEmpty)
79 {
80 operationStatus = OperationStatus.DestinationTooSmall;
81 break;
82 }
83 destination[0] = '\ufffd';
84 destination = destination.Slice(1);
85 source = source.Slice((int)(pInputBufferRemaining - (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source))));
86 Rune.DecodeFromUtf8(source, out var _, out var bytesConsumed);
87 source = source.Slice(bytesConsumed);
88 operationStatus = OperationStatus.Done;
89 pInputBufferRemaining = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(source));
90 pOutputBufferRemaining = (char*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(destination));
91 }
92 bytesRead = (int)(pInputBufferRemaining - ptr);
93 charsWritten = (int)(pOutputBufferRemaining - ptr2);
94 return operationStatus;
95 }
96 }
97 }

References System.Text.Rune.DecodeFromUtf8(), System.destination, System.source, and System.Text.Unicode.Utf8Utility.TranscodeToUtf16().

Referenced by System.Text.UTF8Encoding.GetCharsWithFallback(), and System.Net.Http.Headers.HeaderDescriptor.TryDecodeUtf8().