21.4.4代码树表示

代码树是二叉树。每个节点恰好有两个子节点。孩子可以是树叶或树枝。一个叶包含一个原始的、未压缩的值。分支包含指向另一个节点的指针。霍夫曼代码表示在树中的导航。每个左分支都是0位,每个右分支都是1位。

树的内存表示是每个节点两个无符号整数。每一个都描述到另一个节点的叶值或偏移量(以相对于该节点的无符号整数表示)。为了区分值和偏移量,第15位(十进制值32768)与偏移量一起设置。这是安全的,因为树的大小受到限制,要么为字节值压缩提供最多256个元素,要么为不同列值压缩提供最多4096个元素。

压缩数据文件中的树表示几乎是相同的。但是没有写入无符号整数的所有位,而是只写入需要分别表示最大值或偏移量的位数。每个值/偏移提前写一个比特,以区分两者。每个值和每个偏移量所需的比特数是提前计算的,也是代码树描述的一部分。