2012-04-21 40 views
2

我在Python中創建了一個愚蠢的霍夫曼壓縮器,所以我可以將圖像/聲音數據壓縮到我的Tandy Color計算機項目中。解壓縮程序是用6809彙編寫成的。 我找不到存儲huffman樹的方法,所以我生成了彙編代碼,它們走進樹並獲取正確的未壓縮數據。這裏有一個例子:我應該如何表示要在彩色計算機程序中使用的哈夫曼樹?

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

只是爲了好奇 - 您是如何生成彙編代碼的? – hirschhornsalz 2012-04-21 23:11:21

+0

壓縮數據的python代碼基於真實的霍夫曼樹生成彙編代碼。事實上,程序集生成的代碼是一個粗略的樹遍歷器,它使用來自壓縮數據的位遍歷樹並獲取未壓縮的數據。霍夫曼樹枝成爲裝配程序的分支。 – 2012-04-23 20:35:27

回答

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 

現在解碼器僅具有與整數值的低位在每個比特長度之間的截止(存儲上述顛倒的位)進行比較,從最短。在每個位長度內,從一開始的索引爲該符號的查找表提供偏移量。

+0

我想試試,然後我會告訴你,如果一切正常,也許我需要檢查我的Python壓縮機中,因此它會產生一個規範哈夫曼樹畢竟。非常感謝! 用於壓縮機的代碼位於https://github.com/robsonfr/random-source-codes/blob/master/poltergeist-utils/compression.py – 2012-04-23 20:39:10

+1

您可以在抽吸這種解碼器的一個例子。 c。在https://github.com/madler/zlib/tree/develop/contrib/puff。 – 2012-04-23 23:34:14