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 + -
显示快捷键?