【问题标题】:Python pickle wrong encodingPython pickle 错误编码
【发布时间】:2014-05-19 21:34:37
【问题描述】:

我正在通过套接字连接发送一些数据。我在线程中有一个时钟滴答作响。从那里我将结果生成给另一个函数;

Midi.py

def startClock(self):
        frame_rate = 24
        interval = 1. / frame_rate
        while True:
            if self.playing:
                for i in range(0,8):
                    #do some irrelevant stuff here
                    quarter_frame = '0x{}{}'.format(i,x)
                    quarter_frame = int(quarter_frame, 16)
                    clock = [0xF1, quarter_frame]
                    yield(clock)

Main.py

def startClock(self):
    clock = midi.startClock()
    for i in clock:
        client.sendMessage(i)
        print(i)

在客户端输出以下内容并且正确:

[241, 12]
[241, 16]
[241, 38]
[241, 48]
[241, 64]
[241, 80]
[241, 96]
[241, 112]
...

当我将它发送到服务器时,像这样:

def sendMessage(self, message):
    self.s.send(pickle.dumps(message))

我得到了一个迭代,如下所示(有时会有所不同,但似乎是从 1 到 16):

[241, 0]
[241, 2]
[241, 3]
[241, 4]
[241, 5]
[241, 7]
[241, 8]
[241, 9]
...

我在这里收到消息:

def receiveMessage(self, conn, addr):
    try:
        while True:
            data = pickle.loads(conn.recv(1024))
            print(data)

哪里出错了?

【问题讨论】:

  • 嗯。你可以用base64编码base64encode.net/python-base64-b64encode看看是不是真的是编码问题
  • 为什么有两个startClock(self) 方法?
  • Main.py 中的一个处理按钮点击,另一个处理时钟。
  • 如果你想把完整的代码贴到 pastebin 里,我会试试看能不能重现你的错误。
  • base64 编码乍一看似乎无法修复它。明天我会好好看看它

标签: python sockets pickle


【解决方案1】:

昨天有人在这里发布了答案,但它似乎已被删除。无论如何,如果我更改要发送的字节大小,我会在线路的另一端收到正确的输出。
所以

data = pickle.loads(conn.recv(1024))

应该是

data = pickle.loads(conn.recv(12))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2019-01-18
    • 2011-03-14
    相关资源
    最近更新 更多