Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 3中通过套接字发送原始二进制数据_Python_Sockets_Huffman Code - Fatal编程技术网

在Python 3中通过套接字发送原始二进制数据

在Python 3中通过套接字发送原始二进制数据,python,sockets,huffman-code,Python,Sockets,Huffman Code,我正在研究哈夫曼编码和解码。我已经使用哈夫曼算法将一个字符串编码成二进制,现在我想通过使用Python 3的套接字将其发送到另一台计算机,在那里编码的数据将被解码回来。最有效的方法是什么 编码器部分代码: import heapq import socket class HuffmanEncoder: output = {}; class Node: def __init__(self,data,freq,left=None,right=None):

我正在研究哈夫曼编码和解码。我已经使用哈夫曼算法将一个字符串编码成二进制,现在我想通过使用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()

您需要以字节码发送字符串值,然后可以执行以下操作:
socket.send(字节(消息,'utf-8'))
socket.send(message.encode())

如果你想发送一些纯文本,你可以直接发送:
b'Spania'
,但是如果你的文本是utf-8(非ascii),你必须这样做:
'España'.encode()

看看这个客户端示例,观察默认使用UTF-8的
.encode()
.decode()

#!/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()
看看 当尝试发送原始8位二进制数据时,Python将按照以下规则在通过套接字发送之前对其进行编码:

“如果值小于128,则由相应的字节表示 值。如果值>=128,则将其转换为两个序列, 三个或四个字节,其中序列的每个字节介于128和128之间 和255。”

成功地将8位数据数组转换为字符串后,使用

socket.send_string(yourstring.encode('latin-1')

可能看一下python的zeroMQ绑定:你能为我们缩进你的代码吗?是的,当然,我忘了。我不确定我是否理解你的问题。您是在向您的客户端寻求帮助(您没有显示),还是在询问您显示的服务器代码(如果您将从套接字导入socket、AF\u INET、SOCK\u STREAM导入修复为
,则该代码似乎工作正常)。服务器根本没有对字节进行任何编码或解码,因此如果你问这个问题,它似乎有点不连贯。你认为字节字符串和你的“原始二进制数据”有什么区别?@Blckkknght我在上面添加了我的编码器代码。现在我首先看到的不是二进制数据,它只是一个二进制字符串。这能帮我节省带宽吗?我的意思是它毕竟只是字符,我似乎得到了比实际信息更多的字符。