找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1604|回复: 0
打印 上一主题 下一主题
收起左侧

哈夫曼py程序

[复制链接]
跳转到指定楼层
楼主
ID:143174 发表于 2018-6-24 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序可参考

py源程序如下:
  1. import hufcode
  2. import statistic
  3. import six
  4. def decompress():
  5.     print("please input youer filename")
  6.     inputfilename=input()
  7.     f = open(inputfilename,'rb')
  8.     filedata1 = f.read()
  9.     filedata=bytearray(filedata1)
  10.     filesize = f.tell()
  11.     #print(filedata)


  12.     a1 = filedata[0]
  13.     a2 = filedata[1]
  14.     a3 = filedata[2]
  15.     a4 = filedata[3]
  16.     j = 0
  17.     j = j|a1
  18.     j = j<<8
  19.     j = j|a2
  20.     j = j<<8
  21.     j = j|a3
  22.     j = j<<8
  23.     j = j|a4

  24.     leaf_node_size = j

  25.    
  26.    
  27.     char_freq = {}
  28.     for i in range(leaf_node_size):
  29.         c = filedata[4+i*5+0]

  30.         
  31.         a1 = filedata[4+i*5+1]
  32.         a2 = filedata[4+i*5+2]
  33.         a3 = filedata[4+i*5+3]
  34.         a4 = filedata[4+i*5+4]
  35.         j=0
  36.         j = j|a1
  37.         j = j<<8
  38.         j = j|a2
  39.         j = j<<8
  40.         j = j|a3
  41.         j = j<<8
  42.         j = j|a4
  43.         #print (c, j)
  44.         char_freq[c] = j
  45.         j=0

  46.     list1=[]
  47.     list_all=[]
  48.     for x in char_freq.keys():
  49.         list1.append((x,char_freq[x]))

  50.     list1.sort()
  51.     list_all=[item[0]for item in list1]
  52.     #print(list1)
  53.     #print(list_all)

  54.     nodes = hufcode.createNodes([item[1] for item in list1])   #出现次数
  55.     root = hufcode.createHuffmanTree(nodes)                #叶子节点
  56.     codes = hufcode.huffmanEncoding(nodes,root)            #编码


  57.     #print(codes)
  58.    

  59.     code1=''
  60.     for x in range(leaf_node_size*5+4,filesize):
  61.         c = filedata[x]
  62.         for i in range(8):
  63.             if c&128:
  64.                 code1 = code1 +'1'
  65.             else:
  66.                 code1 = code1 + '0'
  67.             c = c<<1
  68.     #print(code1)

  69.     newcode=dict(zip(codes,list_all))
  70.     print(newcode)
  71.    
  72.     #print(newcode.get('1000'))
  73.     #print(bytes((int(newcode.get('1000')),)).decode("ascii"))
  74.     i=0
  75.     res=''
  76.     while i < len(code1)-24:
  77.         j = i+1
  78.         while j < len(code1): #获取某一字符的code
  79.             if code1[i:j] in newcode.keys():
  80.                 break
  81.             j += 1
  82.         #print(code1[i:j])
  83.         res =res + bytes((int(newcode.get(str(code1[i:j]))),)).decode('ascii')
  84.         #print(res)
  85.         i = j
  86.    
  87.     sub_code = code1[-16:-8]
  88.     last_length = 0
  89.     for i in range(8):
  90.         last_length = last_length<<1
  91.         if sub_code[i] == '1':
  92.             last_length = last_length|1
  93.    
  94.     code1=code1[-24:-16]+code1[-8:-8+last_length]

  95.     i=0
  96.     while i < len(code1):
  97.         j = i+1
  98.         while j < len(code1): #获取某一字符的code
  99.             if code1[i:j] in newcode.keys():
  100.                 break
  101.             j += 1
  102.         #print(code1[i:j])
  103.         res =res + bytes((int(newcode.get(str(code1[i:j]))),)).decode('ascii')
  104.         #print(res)
  105.         i = j

  106.     print(res)
  107.    
  108.     print("\ndo you want save it? 1/yes,2/no")
  109.     ans=input()
  110.     ans=int(ans)
  111.     if ans==1:
  112.         print('please input the filename')
  113.         outfilename=input()
  114.         out = open(outfilename,"w")
  115.         out.write(res)
  116.         out.close
  117.     else:
  118.         pass
复制代码

所有资料51hei提供下载:
霍夫曼.rar (14.57 KB, 下载次数: 7)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表