rangecoder.h

来自「经过项目量产验证的代码.开发环境是sparc+vxworks. 这个LZMA是专」· C头文件 代码 · 共 91 行

H
91
字号
// Compression/RangeCoder.h// This code is based on Eugene Shelwien's Rangecoder code#ifndef __COMPRESSION_RANGECODER_H#define __COMPRESSION_RANGECODER_H#include "InByte.h"const int kNumTopBits = 24;const UINT32 kTopValue = (1 << kNumTopBits);class CRangeDecoder{public:  CInByte m_Stream;  UINT32 m_Range;  UINT32 m_Code;  UINT32 m_Word;  void Normalize()  {    while (m_Range < kTopValue)    {      m_Code = (m_Code << 8) | m_Stream.ReadByte();      m_Range <<= 8;    }  }    void Init(const BYTE *buffer, int size)  {    m_Stream.Init(buffer, size);    m_Code = 0;    m_Range = UINT32(-1);    for(int i = 0; i < 5; i++)      m_Code = (m_Code << 8) | m_Stream.ReadByte();  }  UINT32 DecodeDirectBits(UINT32 numTotalBits)  {    UINT32 range = m_Range;    UINT32 code = m_Code;            UINT32 result = 0;    for (UINT32 i = numTotalBits; i > 0; i--)    {      range >>= 1;      /*      result <<= 1;      if (code >= range)      {        code -= range;        result |= 1;      }      */      UINT32 t = (code - range) >> 31;      code -= range & (t - 1);      // range = aRangeTmp + ((range & 1) & (1 - t));      result = (result << 1) | (1 - t);      if (range < kTopValue)      {        code = (code << 8) | m_Stream.ReadByte();        range <<= 8;       }    }    m_Range = range;    m_Code = code;    return result;  }  int DecodeBit(UINT32 size0, UINT32 numTotalBits)  {    UINT32 newBound = (m_Range >> numTotalBits) * size0;    int symbol;    if (m_Code < newBound)    {      symbol = 0;      m_Range = newBound;    }    else    {      symbol = 1;      m_Code -= newBound;      m_Range -= newBound;    }    Normalize();    return symbol;  }};#endif

⌨️ 快捷键说明

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