implodehuffmandecoder.cpp

来自「由7-zip提供的压缩、解压缩程序」· C++ 代码 · 共 90 行

CPP
90
字号
// ImplodeHuffmanDecoder.cpp#include "StdAfx.h"#include "ImplodeHuffmanDecoder.h"namespace NCompress {namespace NImplode {namespace NHuffman {CDecoder::CDecoder(UInt32 numSymbols):  m_NumSymbols(numSymbols){  m_Symbols = new UInt32[m_NumSymbols];}CDecoder::~CDecoder(){  delete []m_Symbols;}bool CDecoder::SetCodeLengths(const Byte *codeLengths){  // int lenCounts[kNumBitsInLongestCode + 1], tmpPositions[kNumBitsInLongestCode + 1];  int lenCounts[kNumBitsInLongestCode + 2], tmpPositions[kNumBitsInLongestCode + 1];  int i;  for(i = 0; i <= kNumBitsInLongestCode; i++)    lenCounts[i] = 0;  UInt32 symbolIndex;  for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)    lenCounts[codeLengths[symbolIndex]]++;  // lenCounts[0] = 0;    // tmpPositions[0] = m_Positions[0] = m_Limitits[0] = 0;  m_Limitits[kNumBitsInLongestCode + 1] = 0;  m_Positions[kNumBitsInLongestCode + 1] = 0;  lenCounts[kNumBitsInLongestCode + 1] =  0;  UInt32 startPos = 0;  static const UInt32 kMaxValue = (1 << kNumBitsInLongestCode);  for (i = kNumBitsInLongestCode; i > 0; i--)  {    startPos += lenCounts[i] << (kNumBitsInLongestCode - i);    if (startPos > kMaxValue)      return false;    m_Limitits[i] = startPos;    m_Positions[i] = m_Positions[i + 1] + lenCounts[i + 1];    tmpPositions[i] = m_Positions[i] + lenCounts[i];  }  // if _ZIP_MODE do not throw exception for trees containing only one node   // #ifndef _ZIP_MODE   if (startPos != kMaxValue)    return false;  // #endif  for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)    if (codeLengths[symbolIndex] != 0)      m_Symbols[--tmpPositions[codeLengths[symbolIndex]]] = symbolIndex;  return true;}UInt32 CDecoder::DecodeSymbol(CInBit *inStream){  UInt32 numBits;  UInt32 value = inStream->GetValue(kNumBitsInLongestCode);  int i;  for(i = kNumBitsInLongestCode; i > 0; i--)  {    if (value < m_Limitits[i])    {      numBits = i;      break;    }  }  if (i == 0)    return 0xFFFFFFFF;  inStream->MovePos(numBits);  UInt32 index = m_Positions[numBits] +       ((value - m_Limitits[numBits + 1]) >> (kNumBitsInLongestCode - numBits));  if (index >= m_NumSymbols)    return 0xFFFFFFFF;  return m_Symbols[index];}}}}

⌨️ 快捷键说明

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