2016-11-23 45 views
0

我正在进行霍夫曼编码和解码。我已经使用Huffman算法将字符串编码为二进制,现在我想通过使用Python 3的套接字将其发送到另一台计算机,其中编码数据将被解码回来。什么是最有效的方式?代码通过Python中的套接字发送原始二进制数据3

编码器部分:

import heapq 
import socket 

class HuffmanEncoder: 
    output = {}; 
    class Node: 
     def __init__(self,data,freq,left=None,right=None): 
      self.data = data 
      self.freq = freq 
      self.left = left 
      self.right = right 

    def __init__(self,root): 
     self.root = root 

    def isLeaf(root): 
     return not root.left and not root.right 

    def buildHuffman(p): 
     while len(p) != 1: 
      left = heapq.heappop(p)[1] 
      right = heapq.heappop(p)[1] 
      top = HuffmanEncoder.Node('$',left.freq + right.freq) 
      top.left = left 
      top.right = right 
      heapq.heappush(p,(top.freq,top)) 
     return heapq.heappop(p)[1] 

    def printCodes(root,arr,top): 
     if root.left: 
      arr.insert(top,'0') 
      HuffmanEncoder.printCodes(root.left,arr,top + 1) 

     if root.right: 
      arr.insert(top,'1') 
      HuffmanEncoder.printCodes(root.right,arr,top + 1) 

     if HuffmanEncoder.isLeaf(root): 
      s = "" 
      for i in range(0,top): 
       s += arr[i] 
      HuffmanEncoder.output[root.data] = s 
     return HuffmanEncoder.output 

def main(): 
    p = [] 
    arr = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',' '] 
    freq = [8.167,1.492,2.782,4.253,12.702,2.228,2.015,6.094,6.966,0.153,0.772,4.025,2.406,6.749,7.507,1.929,0.095,5.987,6.327,9.056,2.758,0.978,2.360,0.150,1.974,0.074,25.422] 
    for i in range(0,len(arr)): 
     x = HuffmanEncoder.Node(arr[i],freq[i]) 
     heapq.heappush(p,(x.freq,x)) 

    root = HuffmanEncoder.buildHuffman(p) 
    arr = [] 
    top = 0 
    codes = HuffmanEncoder.printCodes(root,arr,top) 
    for key in sorted(codes): 
     print(key,codes[key]) 
    s = input() 
    for i in range(0,len(s)): 
     print(codes[s[i]]) 

if __name__ == '__main__': 
       main() 
+0

可能看看zeroMQ绑定的Python:http://zeromq.org/bindings:python – kezzos

+0

你可以缩进您对我们的代码? – moopet

+0

当然是啊,我忘了。 –

回答

0

您需要在字节码发送的字符串值,那么你可以做:socket.send(byte(message,'utf-8')) 或者socket.send(message.encode())

如果你想送您可以直接发送一些纯文本:b'Spain'但如果你的文本是UTF-8(非ASCII),你必须做到:'España'.encode()

看客户的这个例子,手表.encode().decode()它默认使用UTF-8:

#!/usr/bin/python3 
import socket 

s = socket.socket() 
s.connect(("localhost", 9999)) 

while True: 
    msg = input("> ") 
    s.send(msg.encode()) 
    if msg == "quit": 
     break 
    received=s.recv(1024) 
    print(received.decode()) 

print("Bye") 

s.close() 
相关问题