unsafe public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
{
if (bytes == null)
throw new ArgumentNullException(nameof(bytes));
if (byteIndex < 0)
throw new ArgumentOutOfRangeException(nameof(byteIndex), SR.ValueMustBeNonNegative);
if (byteIndex > bytes.Length)
throw new ArgumentOutOfRangeException(nameof(byteIndex), SR.Format(SR.OffsetExceedsBufferSize, bytes.Length));
if (byteCount < 0)
throw new ArgumentOutOfRangeException(nameof(byteCount), SR.ValueMustBeNonNegative);
if (byteCount > bytes.Length - byteIndex)
throw new ArgumentOutOfRangeException(nameof(byteCount), SR.Format(SR.SizeExceedsRemainingBufferSpace, bytes.Length - byteIndex));
int charCount = GetCharCount(bytes, byteIndex, byteCount);
if (chars == null)
throw new ArgumentNullException(nameof(chars));
if (charIndex < 0)
throw new ArgumentOutOfRangeException(nameof(charIndex), SR.ValueMustBeNonNegative);
if (charIndex > chars.Length)
throw new ArgumentOutOfRangeException(nameof(charIndex), SR.Format(SR.OffsetExceedsBufferSize, chars.Length));
if (charCount < 0 || charCount > chars.Length - charIndex)
throw new ArgumentException(SR.XmlArrayTooSmall, nameof(chars));
if (byteCount > 0)
{
fixed (char* _val2char = s_val2char)
{
fixed (byte* _bytes = &bytes[byteIndex])
{
fixed (char* _chars = &chars[charIndex])
{
char* pch = _chars;
byte* pb = _bytes;
byte* pbMax = _bytes + byteCount;
while (pb < pbMax)
{
pch[0] = _val2char[pb[0] >> 4];
pch[1] = _val2char[pb[0] & 0x0F];
pb++;
pch += 2;
}
}
}
}
}
return charCount;
}
}