System.Text.BaseCodePageEncoding.GetCodePageByteSize C# (CSharp) Method

GetCodePageByteSize() private method

private GetCodePageByteSize ( int codePage ) : int
codePage int
return int
        internal static unsafe int GetCodePageByteSize(int codePage)
        {
            // Loop through all of the m_pCodePageIndex[] items to find our code page
            byte[] codePageIndex = new byte[sizeof(CodePageIndex)];

            lock (s_streamLock)
            {
                // seek to the first CodePageIndex entry
                s_codePagesEncodingDataStream.Seek(CODEPAGE_DATA_FILE_HEADER_SIZE, SeekOrigin.Begin);

                int codePagesCount;
                fixed (byte* pBytes = s_codePagesDataHeader)
                {
                    CodePageDataFileHeader* pDataHeader = (CodePageDataFileHeader*)pBytes;
                    codePagesCount = pDataHeader->CodePageCount;
                }

                fixed (byte* pBytes = codePageIndex)
                {
                    CodePageIndex* pCodePageIndex = (CodePageIndex*)pBytes;
                    for (int i = 0; i < codePagesCount; i++)
                    {
                        s_codePagesEncodingDataStream.Read(codePageIndex, 0, codePageIndex.Length);

                        if (pCodePageIndex->CodePage == codePage)
                        {
                            Debug.Assert(pCodePageIndex->ByteCount == 1 || pCodePageIndex->ByteCount == 2,
                                "[BaseCodePageEncoding] Code page (" + codePage + ") has invalid byte size (" + pCodePageIndex->ByteCount + ") in table");
                            // Return what it says for byte count
                            return pCodePageIndex->ByteCount;
                        }
                    }
                }
            }

            // Couldn't find it
            return 0;
        }

Usage Example

        public override Encoding GetEncoding(int codepage)
        {
            if (codepage < 0 || codepage > 65535)
            {
                return(null);
            }

            if (codepage == 0)
            {
                // Retrieve the system default non-unicode code page if possible, or return null,
                // giving the rest of the EncodingProviders a chance to return a default.
                int systemDefaultCodePage = SystemDefaultCodePage;
                return(systemDefaultCodePage != 0 ?
                       GetEncoding(systemDefaultCodePage) :
                       null);
            }

            Encoding result = null;

            _cacheLock.EnterUpgradeableReadLock();
            try
            {
                if (_encodings.TryGetValue(codepage, out result))
                {
                    return(result);
                }

                int i = BaseCodePageEncoding.GetCodePageByteSize(codepage);

                if (i == 1)
                {
                    result = new SBCSCodePageEncoding(codepage);
                }
                else if (i == 2)
                {
                    result = new DBCSCodePageEncoding(codepage);
                }
                else
                {
                    result = GetEncodingRare(codepage);
                    if (result == null)
                    {
                        return(null);
                    }
                }

                _cacheLock.EnterWriteLock();
                try
                {
                    Encoding cachedEncoding;
                    if (_encodings.TryGetValue(codepage, out cachedEncoding))
                    {
                        return(cachedEncoding);
                    }

                    _encodings.Add(codepage, result);
                }
                finally
                {
                    _cacheLock.ExitWriteLock();
                }
            }
            finally
            {
                _cacheLock.ExitUpgradeableReadLock();
            }

            return(result);
        }