Пример #1
0
        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));
        }
Пример #2
0
        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)));
            }
        }