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

标签 assembly tree compression huffman-code

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

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

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

感谢您的宝贵时间。

最佳答案

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

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

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

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

关于assembly - 我应该如何表示要在彩色计算机程序中使用的霍夫曼树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10263641/

相关文章:

assembly - 使用 gas (-fPIC) 生成位置无关代码

c - 在 L1 缓存 : only getting 62% 中获取 Haswell 上的峰值带宽

python - 从满足约束的列表中查找子集的算法

python - Burrows-Wheeler 变换 (BWT) 重复字符串

python - GZip 在 Python 脚本中读取文件时出错

linux - 如何使用特定偏移量处的给定 key 通过 XOR 运算符解密二进制文件中的数据?

linux - 段错误......在 Hello World 上

algorithm - 二叉树的第一个共同祖先

r - 在 R 中构建 N 叉树

assembly - 所有asm标签都成为可执行文件中的符号