public static unsafe int ToUtf16Chars(byte[] data, int offset, int count, char[] buffer, int bufferOffset, InvalidDataProcessor processor = null) { if (data.Length < offset + count) { throw new IndexOutOfRangeException("offset + count exceeds on byte array length"); } var dataptr = (byte *)Unsafe.AsPointer(ref data[offset]); var endptr = dataptr + count; var beginptr = (char *)Unsafe.AsPointer(ref buffer[offset]); var iterptr = beginptr; UpdateCharUnsafe(ref dataptr, ref endptr, ref iterptr, ref processor); return((int)(iterptr - beginptr)); }
public unsafe static string ToUtf16String(byte[] data, int offset, int count, InvalidDataProcessor processor = null) { if (data.Length < offset + count) { throw new IndexOutOfRangeException("offset + count exceeds on byte array length"); } var dataptr = (byte *)Unsafe.AsPointer(ref data[offset]); var endptr = dataptr + count; if (count < 257) { var buf = stackalloc char[count]; char *iterptr = buf; UpdateCharUnsafe(ref dataptr, ref endptr, ref iterptr, ref processor); return(new string(buf, 0, (int)(iterptr - buf))); } else { Buffer = Buffer != null && Buffer.Length >= count ? Buffer : new char[count]; char *iterptr = (char *)Unsafe.AsPointer(ref Buffer[0]); char *beginptr = iterptr; UpdateCharUnsafe(ref dataptr, ref endptr, ref iterptr, ref processor); return(new string(beginptr, 0, (int)(iterptr - beginptr))); } }