我在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
我想使用真正的霍夫曼树,而不是创建汇编代码来实现它。
感谢您的时间。
答案 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
现在解码器只需要在每个位长度之间的截止值处将低位与整数值进行比较(将数据存储在反转之上),从最短的开始。在每个位长度内,从开头开始的索引为符号的查找表提供了一个偏移量。