我应该如何表示在彩色计算机程序中使用的霍夫曼树?

时间:2012-04-21 22:38:11

标签: assembly tree compression huffman-code

我在Python中创建了一个愚蠢的霍夫曼压缩器,因此我可以压缩要在我的Tandy Color计算机项目中应用的图像/声音数据。解压缩程序是在6809 Assembly中编写的。 我找不到存储霍夫曼树的方法,所以我生成了汇编代码,它进入树中并获得正确的未压缩数据。这是一个例子:

DECOMP_HUFFMAN:        PSHS    A,B,X,Y,U
                       LDB     #8
                       STB     $2100
                       pshs    x
                       ldx     $2102
                       stx     $2106
                       puls    x                       
                       LDB     ,X+
                       JMP     inicio
prox_bit:              LSLB
                       PSHS    CC
                       DEC     $2100
                       BNE     S_P_B
                       LDB     #8
                       STB     $2100
                       LDB       ,X+
S_P_B:                 PULS    CC
                       RTS
armazena:              STA       ,U+
                       LEAY    -1,Y
                       BNE      inicio
                       PULS   U,Y,X,B,A
                       RTS


inicio:     jsr prox_bit
            tfr  cc,a
            anda #1
            sta  $2104
            lda ($2102)
            bne  n1
            lda $2104
n0:         pshs x
            ldx  $2102
            leax 1,x
            lda  a,x            
            puls x
            bsr  armazena
            pshs x
            ldx  $2106
            stx  $2102
            puls x
            bra inicio


n1:         cmpa #1
            bne  n2
            lda  $2104
            bne  n0
            bra  n4

n2:         cmpa #2
            bne  n3
            lda  $2104
            beq  n0

n3:         lda  $2104
n4:         pshs x
            ldx   $2102
            leax  1,x
            lda   a,x
            leax  a,x            
            stx   $2102
            puls x
            bra   inicio

我想使用真正的霍夫曼树,而不是创建汇编代码来实现它。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

您只需发送每个符号的代码长度即可传输霍夫曼代码。您不需要发送树。代码长度为零表示该符号不会出现。

您发送的内容可能类似于:

A: 2
B: 0
C: 0
D: 3
E: 1
F: 0
G: 0
H: 0
I: 3
J: 0

只发送数字的地方 - 符号的分配符号顺序。

两端都将采用规范的霍夫曼代码,其中代码值按照从最短代码长度到最长代码的顺序分配。在比特长度内,代码按顺序递增地分配给符号。例如(符号:代码长度 - 代码):

E: 1 - 0
A: 2 - 10
D: 3 - 110
I: 3 - 111

现在解码器只需要在每个位长度之间的截止值处将低位与整数值进行比较(将数据存储在反转之上),从最短的开始。在每个位长度内,从开头开始的索引为符号的查找表提供了一个偏移量。