public override int GetMaxCharCount(int byteCount)
 {
     if (byteCount < 0)
     {
         throw new ArgumentOutOfRangeException("byteCount", UnixEncoding._("ArgRange_NonNegative"));
     }
     return(byteCount);
 }
 private static void CopyRaw(byte[] raw, ref int next_raw, char[] chars, ref int posn, int length)
 {
     if (posn + next_raw * 2 > length)
     {
         throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "chars");
     }
     for (int i = 0; i < next_raw; i++)
     {
         int num  = posn;
         int num1 = num;
         posn        = num + 1;
         chars[num1] = UnixEncoding.EscapeByte;
         int num2 = posn;
         num1        = num2;
         posn        = num2 + 1;
         chars[num1] = (char)raw[i];
     }
     next_raw = 0;
 }
        private static int InternalGetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex, ref uint leftOverBits, ref uint leftOverCount, bool throwOnInvalid, bool flush)
        {
            if (bytes == null)
            {
                throw new ArgumentNullException("bytes");
            }
            if (chars == null)
            {
                throw new ArgumentNullException("chars");
            }
            if (byteIndex < 0 || byteIndex > (int)bytes.Length)
            {
                throw new ArgumentOutOfRangeException("byteIndex", UnixEncoding._("ArgRange_Array"));
            }
            if (byteCount < 0 || byteCount > (int)bytes.Length - byteIndex)
            {
                throw new ArgumentOutOfRangeException("byteCount", UnixEncoding._("ArgRange_Array"));
            }
            if (charIndex < 0 || charIndex > (int)chars.Length)
            {
                throw new ArgumentOutOfRangeException("charIndex", UnixEncoding._("ArgRange_Array"));
            }
            if (charIndex == (int)chars.Length)
            {
                return(0);
            }
            byte[] numArray = new byte[6];
            int    num      = 0;
            int    length   = (int)chars.Length;
            int    num1     = charIndex;
            uint   num2     = leftOverBits;
            uint   num3     = leftOverCount & 15;
            uint   num4     = leftOverCount >> 4 & 15;

            while (byteCount > 0)
            {
                int num5 = byteIndex;
                byteIndex = num5 + 1;
                uint num6 = bytes[num5];
                int  num7 = num;
                num            = num7 + 1;
                numArray[num7] = (byte)num6;
                byteCount--;
                if (num4 != 0)
                {
                    if ((num6 & 192) != 128)
                    {
                        !throwOnInvalid;
                        if (num6 < 128)
                        {
                            byteIndex--;
                            byteCount++;
                            num--;
                        }
                        UnixEncoding.CopyRaw(numArray, ref num, chars, ref num1, length);
                        num4 = 0;
                        num  = 0;
                    }
                    else
                    {
                        num2 = num2 << 6 | num6 & 63;
                        UInt32 num8 = num3 + 1;
                        num3 = num8;
                        if (num8 >= num4)
                        {
                            if (num2 < 65536)
                            {
                                bool flag = false;
                                switch (num4)
                                {
                                case 2:
                                {
                                    flag = num2 <= 127;
                                    break;
                                }

                                case 3:
                                {
                                    flag = num2 <= 2047;
                                    break;
                                }

                                case 4:
                                {
                                    flag = num2 <= 65535;
                                    break;
                                }

                                case 5:
                                {
                                    flag = num2 <= 2097151;
                                    break;
                                }

                                case 6:
                                {
                                    flag = num2 <= 67108863;
                                    break;
                                }
                                }
                                if (!flag)
                                {
                                    if (num1 >= length)
                                    {
                                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "chars");
                                    }
                                    int num9 = num1;
                                    num1        = num9 + 1;
                                    chars[num9] = (char)num2;
                                }
                                else
                                {
                                    UnixEncoding.CopyRaw(numArray, ref num, chars, ref num1, length);
                                }
                            }
                            else if (num2 < 1114112)
                            {
                                if (num1 + 2 > length)
                                {
                                    throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "chars");
                                }
                                num2 -= 65536;
                                int num10 = num1;
                                num1         = num10 + 1;
                                chars[num10] = (char)((num2 >> 10) + 55296);
                                int num11 = num1;
                                num1         = num11 + 1;
                                chars[num11] = (char)((num2 & 1023) + 56320);
                            }
                            else if (throwOnInvalid)
                            {
                                UnixEncoding.CopyRaw(numArray, ref num, chars, ref num1, length);
                            }
                            num4 = 0;
                            num  = 0;
                        }
                    }
                }
                else if (num6 < 128)
                {
                    if (num1 >= length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "chars");
                    }
                    num = 0;
                    int num12 = num1;
                    num1         = num12 + 1;
                    chars[num12] = (char)num6;
                }
                else if ((num6 & 224) == 192)
                {
                    num2 = num6 & 31;
                    num3 = 1;
                    num4 = 2;
                }
                else if ((num6 & 240) == 224)
                {
                    num2 = num6 & 15;
                    num3 = 1;
                    num4 = 3;
                }
                else if ((num6 & 248) == 240)
                {
                    num2 = num6 & 7;
                    num3 = 1;
                    num4 = 4;
                }
                else if ((num6 & 252) == 248)
                {
                    num2 = num6 & 3;
                    num3 = 1;
                    num4 = 5;
                }
                else if ((num6 & 254) != 252)
                {
                    !throwOnInvalid;
                    num = 0;
                    int num13 = num1;
                    num1         = num13 + 1;
                    chars[num13] = UnixEncoding.EscapeByte;
                    int num14 = num1;
                    num1         = num14 + 1;
                    chars[num14] = (char)num6;
                }
                else
                {
                    num2 = num6 & 3;
                    num3 = 1;
                    num4 = 6;
                }
            }
            if (flush && num4 != 0 && throwOnInvalid)
            {
                UnixEncoding.CopyRaw(numArray, ref num, chars, ref num1, length);
            }
            leftOverBits  = num2;
            leftOverCount = num3 | num4 << 4;
            return(num1 - charIndex);
        }
        private static int InternalGetCharCount(byte[] bytes, int index, int count, uint leftOverBits, uint leftOverCount, bool throwOnInvalid, bool flush)
        {
            if (bytes == null)
            {
                throw new ArgumentNullException("bytes");
            }
            if (index < 0 || index > (int)bytes.Length)
            {
                throw new ArgumentOutOfRangeException("index", UnixEncoding._("ArgRange_Array"));
            }
            if (count < 0 || count > (int)bytes.Length - index)
            {
                throw new ArgumentOutOfRangeException("count", UnixEncoding._("ArgRange_Array"));
            }
            int  num  = 0;
            int  num1 = 0;
            uint num2 = leftOverBits;
            uint num3 = leftOverCount & 15;
            uint num4 = leftOverCount >> 4 & 15;

            while (count > 0)
            {
                int num5 = index;
                index = num5 + 1;
                uint num6 = bytes[num5];
                num++;
                count--;
                if (num4 != 0)
                {
                    if ((num6 & 192) != 128)
                    {
                        !throwOnInvalid;
                        if (num6 < 128)
                        {
                            index--;
                            count++;
                            num--;
                        }
                        num1 = num1 + num * 2;
                        num4 = 0;
                        num  = 0;
                    }
                    else
                    {
                        num2 = num2 << 6 | num6 & 63;
                        UInt32 num7 = num3 + 1;
                        num3 = num7;
                        if (num7 >= num4)
                        {
                            if (num2 < 65536)
                            {
                                bool flag = false;
                                switch (num4)
                                {
                                case 2:
                                {
                                    flag = num2 <= 127;
                                    break;
                                }

                                case 3:
                                {
                                    flag = num2 <= 2047;
                                    break;
                                }

                                case 4:
                                {
                                    flag = num2 <= 65535;
                                    break;
                                }

                                case 5:
                                {
                                    flag = num2 <= 2097151;
                                    break;
                                }

                                case 6:
                                {
                                    flag = num2 <= 67108863;
                                    break;
                                }
                                }
                                if (!flag)
                                {
                                    num1++;
                                }
                                else
                                {
                                    num1 = num1 + num * 2;
                                }
                            }
                            else if (num2 < 1114112)
                            {
                                num1 += 2;
                            }
                            else if (throwOnInvalid)
                            {
                                num1 = num1 + num * 2;
                            }
                            num4 = 0;
                            num  = 0;
                        }
                    }
                }
                else if (num6 < 128)
                {
                    num1++;
                    num = 0;
                }
                else if ((num6 & 224) == 192)
                {
                    num2 = num6 & 31;
                    num3 = 1;
                    num4 = 2;
                }
                else if ((num6 & 240) == 224)
                {
                    num2 = num6 & 15;
                    num3 = 1;
                    num4 = 3;
                }
                else if ((num6 & 248) == 240)
                {
                    num2 = num6 & 7;
                    num3 = 1;
                    num4 = 4;
                }
                else if ((num6 & 252) == 248)
                {
                    num2 = num6 & 3;
                    num3 = 1;
                    num4 = 5;
                }
                else if ((num6 & 254) != 252)
                {
                    !throwOnInvalid;
                    num1 = num1 + num * 2;
                    num  = 0;
                }
                else
                {
                    num2 = num6 & 3;
                    num3 = 1;
                    num4 = 6;
                }
            }
            if (flush && num4 != 0 && throwOnInvalid)
            {
                num1 = num1 + num * 2;
            }
            return(num1);
        }
        private static int InternalGetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, ref uint leftOver, bool flush)
        {
            uint num;

            if (chars == null)
            {
                throw new ArgumentNullException("chars");
            }
            if (bytes == null)
            {
                throw new ArgumentNullException("bytes");
            }
            if (charIndex < 0 || charIndex > (int)chars.Length)
            {
                throw new ArgumentOutOfRangeException("charIndex", UnixEncoding._("ArgRange_Array"));
            }
            if (charCount < 0 || charCount > (int)chars.Length - charIndex)
            {
                throw new ArgumentOutOfRangeException("charCount", UnixEncoding._("ArgRange_Array"));
            }
            if (byteIndex < 0 || byteIndex > (int)bytes.Length)
            {
                throw new ArgumentOutOfRangeException("byteIndex", UnixEncoding._("ArgRange_Array"));
            }
            int  length = (int)bytes.Length;
            uint num1   = leftOver;
            int  num2   = byteIndex;

            while (charCount > 0)
            {
                int num3 = charIndex;
                charIndex = num3 + 1;
                char chr = chars[num3];
                charCount--;
                if (num1 != 0)
                {
                    if (chr < '\uDC00' || chr > '\uDFFF')
                    {
                        num  = num1;
                        num1 = 0;
                        charIndex--;
                        charCount++;
                    }
                    else
                    {
                        num  = (num1 - 55296 << 10) + (chr - 56320) + 65536;
                        num1 = 0;
                    }
                }
                else if (chr >= '\uD800' && chr <= '\uDBFF')
                {
                    num1 = chr;
                    continue;
                }
                else if (chr != UnixEncoding.EscapeByte)
                {
                    num = chr;
                }
                else
                {
                    if (num2 >= length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num4 = charCount - 1;
                    charCount = num4;
                    if (num4 >= 0)
                    {
                        int num5 = num2;
                        num2 = num5 + 1;
                        int num6 = charIndex;
                        charIndex   = num6 + 1;
                        bytes[num5] = (byte)chars[num6];
                    }
                    continue;
                }
                if (num < 128)
                {
                    if (num2 >= length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num7 = num2;
                    num2        = num7 + 1;
                    bytes[num7] = (byte)num;
                }
                else if (num < 2048)
                {
                    if (num2 + 2 > length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num8 = num2;
                    num2        = num8 + 1;
                    bytes[num8] = (byte)(192 | num >> 6);
                    int num9 = num2;
                    num2        = num9 + 1;
                    bytes[num9] = (byte)(128 | num & 63);
                }
                else if (num >= 65536)
                {
                    if (num2 + 4 > length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num10 = num2;
                    num2         = num10 + 1;
                    bytes[num10] = (byte)(240 | num >> 18);
                    int num11 = num2;
                    num2         = num11 + 1;
                    bytes[num11] = (byte)(128 | num >> 12 & 63);
                    int num12 = num2;
                    num2         = num12 + 1;
                    bytes[num12] = (byte)(128 | num >> 6 & 63);
                    int num13 = num2;
                    num2         = num13 + 1;
                    bytes[num13] = (byte)(128 | num & 63);
                }
                else
                {
                    if (num2 + 3 > length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num14 = num2;
                    num2         = num14 + 1;
                    bytes[num14] = (byte)(224 | num >> 12);
                    int num15 = num2;
                    num2         = num15 + 1;
                    bytes[num15] = (byte)(128 | num >> 6 & 63);
                    int num16 = num2;
                    num2         = num16 + 1;
                    bytes[num16] = (byte)(128 | num & 63);
                }
            }
            if (flush && num1 != 0)
            {
                if (num2 + 3 > length)
                {
                    throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                }
                int num17 = num2;
                num2         = num17 + 1;
                bytes[num17] = (byte)(224 | num1 >> 12);
                int num18 = num2;
                num2         = num18 + 1;
                bytes[num18] = (byte)(128 | num1 >> 6 & 63);
                int num19 = num2;
                num2         = num19 + 1;
                bytes[num19] = (byte)(128 | num1 & 63);
                num1         = 0;
            }
            leftOver = num1;
            return(num2 - byteIndex);
        }
        private static int InternalGetByteCount(char[] chars, int index, int count, uint leftOver, bool flush)
        {
            if (chars == null)
            {
                throw new ArgumentNullException("chars");
            }
            if (index < 0 || index > (int)chars.Length)
            {
                throw new ArgumentOutOfRangeException("index", UnixEncoding._("ArgRange_Array"));
            }
            if (count < 0 || count > (int)chars.Length - index)
            {
                throw new ArgumentOutOfRangeException("count", UnixEncoding._("ArgRange_Array"));
            }
            int  num  = 0;
            uint num1 = leftOver;

            while (count > 0)
            {
                char chr = chars[index];
                if (num1 != 0)
                {
                    if (chr < '\uDC00' || chr > '\uDFFF')
                    {
                        num += 3;
                        num1 = 0;
                        continue;
                    }
                    else
                    {
                        num += 4;
                        num1 = 0;
                    }
                }
                else if (chr == UnixEncoding.EscapeByte && count > 1)
                {
                    num++;
                    index++;
                    count--;
                }
                else if (chr < '\u0080')
                {
                    num++;
                }
                else if (chr < '\u0800')
                {
                    num += 2;
                }
                else if (chr < '\uD800' || chr > '\uDBFF')
                {
                    num += 3;
                }
                else
                {
                    num1 = chr;
                }
                index++;
                count--;
            }
            if (flush && num1 != 0)
            {
                num += 3;
            }
            return(num);
        }
        public override int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex)
        {
            uint num;

            if (s == null)
            {
                throw new ArgumentNullException("s");
            }
            if (bytes == null)
            {
                throw new ArgumentNullException("bytes");
            }
            if (charIndex < 0 || charIndex > s.Length)
            {
                throw new ArgumentOutOfRangeException("charIndex", UnixEncoding._("ArgRange_StringIndex"));
            }
            if (charCount < 0 || charCount > s.Length - charIndex)
            {
                throw new ArgumentOutOfRangeException("charCount", UnixEncoding._("ArgRange_StringRange"));
            }
            if (byteIndex < 0 || byteIndex > (int)bytes.Length)
            {
                throw new ArgumentOutOfRangeException("byteIndex", UnixEncoding._("ArgRange_Array"));
            }
            int length = (int)bytes.Length;
            int num1   = byteIndex;

            while (charCount > 0)
            {
                int num2 = charIndex;
                charIndex = num2 + 1;
                char chr = s[num2];
                if (chr >= '\uD800' && chr <= '\uDBFF' && charCount > 1)
                {
                    num = s[charIndex];
                    if (num < 56320 || num > 57343)
                    {
                        num = chr;
                    }
                    else
                    {
                        num = num - 56320 + (chr - 55296 << '\n') + 65536;
                        charIndex++;
                        charCount--;
                    }
                }
                else if (chr != UnixEncoding.EscapeByte || charCount <= 1)
                {
                    num = chr;
                }
                else
                {
                    if (num1 >= length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    charCount -= 2;
                    if (charCount >= 0)
                    {
                        int num3 = num1;
                        num1 = num3 + 1;
                        int num4 = charIndex;
                        charIndex   = num4 + 1;
                        bytes[num3] = (byte)s[num4];
                    }
                    continue;
                }
                charCount--;
                if (num < 128)
                {
                    if (num1 >= length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num5 = num1;
                    num1        = num5 + 1;
                    bytes[num5] = (byte)num;
                }
                else if (num < 2048)
                {
                    if (num1 + 2 > length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num6 = num1;
                    num1        = num6 + 1;
                    bytes[num6] = (byte)(192 | num >> 6);
                    int num7 = num1;
                    num1        = num7 + 1;
                    bytes[num7] = (byte)(128 | num & 63);
                }
                else if (num >= 65536)
                {
                    if (num1 + 4 > length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num8 = num1;
                    num1        = num8 + 1;
                    bytes[num8] = (byte)(240 | num >> 18);
                    int num9 = num1;
                    num1        = num9 + 1;
                    bytes[num9] = (byte)(128 | num >> 12 & 63);
                    int num10 = num1;
                    num1         = num10 + 1;
                    bytes[num10] = (byte)(128 | num >> 6 & 63);
                    int num11 = num1;
                    num1         = num11 + 1;
                    bytes[num11] = (byte)(128 | num & 63);
                }
                else
                {
                    if (num1 + 3 > length)
                    {
                        throw new ArgumentException(UnixEncoding._("Arg_InsufficientSpace"), "bytes");
                    }
                    int num12 = num1;
                    num1         = num12 + 1;
                    bytes[num12] = (byte)(224 | num >> 12);
                    int num13 = num1;
                    num1         = num13 + 1;
                    bytes[num13] = (byte)(128 | num >> 6 & 63);
                    int num14 = num1;
                    num1         = num14 + 1;
                    bytes[num14] = (byte)(128 | num & 63);
                }
            }
            return(num1 - byteIndex);
        }