⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbolcoding.cs

📁 PDF文件格式解析库源代码
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;

namespace QiHe.CodeLib.Compress
{
    public struct SymbolCode
    {
        public int Code;
        public int Base;
        public int Offset;
        public int ExtraBits;
    }

    public class SymbolCoding
    {
        int StartCode;
        int[] BaseValues;
        int[] ExtraBits;
        Dictionary<int, SymbolCode> SymbolCodes;

        public SymbolCoding(int startCode, int[] baseValues, int[] extraBits)
        {
            StartCode = startCode;
            BaseValues = baseValues;
            ExtraBits = extraBits;
            SymbolCodes = new Dictionary<int, SymbolCode>();
        }

        public SymbolCode this[int symbol]
        {
            get
            {
                if (!SymbolCodes.ContainsKey(symbol))
                {
                    SymbolCodes[symbol] = CreateSymbolCode(symbol);
                    //TraceTool.Debug.Send(SymbolCodes.Count.ToString());
                }
                return SymbolCodes[symbol];
            }
        }

        SymbolCode CreateSymbolCode(int symbol)
        {
            SymbolCode symbolCode = new SymbolCode();
            int code = GetCode(symbol);
            symbolCode.Base = BaseValues[code];
            symbolCode.ExtraBits = ExtraBits[code];
            symbolCode.Offset = symbol - symbolCode.Base;
            symbolCode.Code = StartCode + code;
            return symbolCode;
        }

        private int GetCode(int symbol)
        {
            int code = -1;
            for (int index = 0; index < BaseValues.Length; index++)
            {
                if (symbol >= BaseValues[index])
                {
                    code = index;
                }
                else
                {
                    break;
                }
            }
            if (code == -1)
            {
                throw new Exception("symbol too small.");
            }
            else
            {
                return code;
            }
        }

        public int GetSymbolBase(int code)
        {
            return BaseValues[code - StartCode];
        }

        public int GetSymbolExtrabits(int code)
        {
            return ExtraBits[code - StartCode];
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -