学习IPPS库的编码部分知识点记录

学习IPPS库的编码部分知识点记录

1、哈夫曼编码

相关函数
IppStatus ippsDeflateHuff_8u(const Ipp8u *pLitSrc, const Ipp16u *pDistSrc, Ipp32u srcLen, Ipp16u *pCode, Ipp32u *pCodeLenBits, IppDeflateHuffCode pLitHuffCodes[286], IppDeflateHuffCode pDistHuffCodes[30], Ipp8u *pDst, Ipp32u *pDstIdx);

此函数执行动态哈夫曼编码。哈夫曼编码的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替。动态哈夫曼不需要事先构造哈夫曼树,而是随着编码的进行,逐步构造哈夫曼树,所以,同一个符号的编码可能前后有所不同。

该函数在调用了函数执行LZ77压缩之后使用,作为deflate算法的第二步。首先使用LZ77算法得到的字符串中包含三类字符:原始输入的字符literal、字符串的长度length、字符串到数据起点的距离distance。之后使用哈夫曼编码时,分别对literal/length、distance进行压缩。其中,对literal和length共同构建一颗哈夫曼树,对distance单独构建哈夫曼树。

静态哈夫曼的基本步骤为:1.首先,按照权重值的大小将符号集合排序;2.接着,取出权重值最小的两个集合元素作为叶节点组成一颗子树,子树的权重值为两个叶节点的权重值之和。然后将新产生的子树放回原来的集合,并保持集合有序。3.重复上述步骤,直至集合中只剩下一个元素,则Huffman编码树构造完成。

2、Adler-32

相关函数
IppStatus ippsAdler32_8u(const Ipp8u *pSrc, int srcLen, Ipp32u *pAdler32);

函数计算pSrc中srcLen个元素的校验和,结果存储在pAdler32中。函数使用Adler32算法来计算校验和。Adler-32算法中使用两个16位的数A、B进行一系列运算,并将运算结果连结成一个32位整数。其中,A表示字符串中每个字节的和(即单个字符对应的ASCII码),而B是A在相加时每一步的阶段值之和。在Adler-32开始运行时,A初始化为1,B初始化为0,最后的校验和要模上65521(继216之后的最小素数)。公式如下:
A = 1 + D1 + D2 + … + Dn (mod 65521)
B = (1 + D1) + (1 + D1 + D2) + … + (1 + D1 + D2 + … + Dn) (mod 65521)
= n×D1 + (n-1)×D2 + (n-2)×D3 + … + Dn + n (mod 65521)
Adler-32(D) = B × 65536 + A
其中D为字符串的字节,n是D的字节长度。本函数中A的初始值等于传入的参数pAdler32的值。下面举例说明:
假设设置(*)pAdler32=1,即A的初始值为1,下面使用Adler-32校验算法产生字符串”Wikipedia”的校验和:
ASCII code A B
W: 87 1 + 87 = 88 0 + 88 = 88
i: 105 88 + 105 = 193 88 + 193 = 281
k: 107 193 + 107 = 300 281 + 300 = 581
i: 105 300 + 105 = 405 581 + 405 = 986
p: 112 405 + 112 = 517 986 + 517 = 1503
e: 101 517 + 101 = 618 1503 + 618 = 2121
d: 100 618 + 100 = 718 2121 + 718 = 2839
i: 105 718 + 105 = 823 2839 + 823 = 3662
a: 97 823 + 97 = 920 3662 + 920 = 4582
A = 920 = 0x398
B = 4582 = 0x11E6
Output: B<<16|A ——> 0x11E60398

你可能感兴趣的:(IPPS)