void SetNodeCode(CHuffmanNode* pNode)
{
CHuffmanNode* pParent = pNode->pParent;
while(pParent && pParent->nCodeLength)
{
pNode->dwCode <<= 1;
pNode->dwCode |= pParent->dwCode;
pNode->nCodeLength++;
pParent = pParent->pParent;
}
}中pNode->dwCode <<= 1;是怎么执行?
pNode->dwCode |= pParent->dwCode;又应该如何执行呢?int nNodeSize = sizeof(DWORD)+sizeof(BYTE);
这句是想表达什么意思?bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen)
{
CHuffmanNode nodes[511];
// initialize nodes ascii
for(int nCount = 0; nCount < 256; nCount++)
nodes[nCount].byAscii = nCount;
// get ascii frequencies
for(nCount = 0; nCount < nSrcLen; nCount++)
nodes[pSrc[nCount]].nFrequency++;
// sort ascii chars depending on frequency
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
// construct Huffman tree
int nNodeCount = GetHuffmanTree(nodes);
// construct compressed buffer
int nNodeSize = sizeof(DWORD)+sizeof(BYTE);
nDesLen = nSrcLen+nNodeCount*nNodeSize;
pDes = (BYTE*)malloc(nDesLen);
BYTE *pDesPtr = pDes;
memset(pDesPtr, 0, nDesLen);
// save source buffer length at the first DWORD
*(DWORD*)pDesPtr = nSrcLen;
pDesPtr += sizeof(DWORD);
// save Huffman tree leaves count-1 (as it may be 256)
*pDesPtr = nNodeCount-1;
pDesPtr += sizeof(BYTE);
// save Huffman tree used leaves nodes
for(nCount = 0; nCount < nNodeCount; nCount++)
{ // the array sorted on frequency so used nodes come first
memcpy(pDesPtr, &nodes[nCount], nNodeSize);
pDesPtr += nNodeSize;
}
// sort nodes depending on ascii to can index nodes with its ascii value
qsort(nodes, 256, sizeof(CHuffmanNode), asciiCompare); int nDesIndex = 0;
// loop to write codes
for(nCount = 0; nCount < nSrcLen; nCount++)
{
*(DWORD*)(pDesPtr+(nDesIndex>>3)) |= nodes[pSrc[nCount]].dwCode << (nDesIndex&7);
nDesIndex += nodes[pSrc[nCount]].nCodeLength;
}
// update destination length
nDesLen = (pDesPtr-pDes)+(nDesIndex+7)/8;
pDes = (BYTE*)realloc(pDes, nDesLen); return true;
}可以的话说明一些这整个函数的执行过程,实在看不太明白。谢谢各位了

解决方案 »

  1.   

    中pNode->dwCode <<= 1;是怎么执行?     等价于pNode->dwCode = pNode->dwCode << 1;
    pNode->dwCode |= pParent->dwCode;又应该如何执行呢?     等价于pNode->dwCode = pNode->dwCode | pParent->dwCode;
    int nNodeSize = sizeof(DWORD)+sizeof(BYTE);
    这句是想表达什么意思?   意思是nNodeSize是一个DWORD和一个BYTE所占字节数的和。楼主的基础有点差哦。:P
      

  2.   

    int nNodeSize = sizeof(DWORD)+sizeof(BYTE);
    这句是想表达什么意思?
    --------------------------------------------------
    nNodeSize=5
    因为:
    sizeof(DWORD)=4