“使用Python通过网络消息必须是16”加密音频的倍数

时间:2011-10-02 19:02:31

标签: python pyaudio

我在Python中通过网络发送加密音频。这个应用程序暂时工作然后打破说它必须是16的倍数。

不确定我做错了什么。或者在哪里查看代码来解决这个问题。

感谢您提供的任何帮助

编辑*我相信如果有人有兴趣看看我做了一个谷歌代码项目,我现在有它的工作

http://code.google.com/p/mii-chat/

2 个答案:

答案 0 :(得分:3)

msg = conn.recv(2024)
if msg:                
    cmd, msg = ord(msg[0]),msg[1:]
    if cmd == CMD_MSG:
        listb1.insert(END, decrypt_my_message(msg.strip()) + "\n")

您的代码上面的代码段读取2024个字节的数据(不是16的倍数)然后(如果“if”语句为True)然后调用decrypt_my_message并使用msg.strip()作为参数。然后,decrypt_my_message抱怨它被赋予了一个字符串,其长度不是16的倍数。(我猜这是问题。看一下回溯,看看这是否是引起异常的行。) / p>

您需要使用长度为n * 16的字符串调用decrypt_my_message。

您可能需要重新考虑读取流的逻辑 - 或者让中间的东西将对decrypt_my_message的调用缓冲为n * 16的块。

答案 1 :(得分:1)

我快速扫描了代码。所有消息都在加密后发送,因此您发送的总数据是16的倍数,加上命令的1。到目前为止,非常好。

在解密端,您将删除该命令,这将再次为您留下16的倍数。但是,在致电msg.strip()之前,您正在呼叫decrypt_my_message。调用strip可能会通过从开头或结尾删除字节来破坏加密数据。

我会进一步检查代码,如果我发现其他任何内容,请编辑此答案。


编辑:

您正在使用空格字符进行填充,我想您打算使用strip调用删除填充。您应该将decrypt_my_message(msg.strip())更改为decrypt_my_message(msg).strip()


您正在使用TCP发送数据,因此您的协议必然会让您长期头痛。我总是使用这种自定义协议在我的消息中发送有效负载的长度,因此接收端可以确定它是否正确接收了消息块。例如,您可以使用:CMD|LEN(2)|PAYLOAD(LEN)作为数据框。这意味着,一个字节用于命令,另外两个字节用于告诉服务器预期要多少字节,以及LEN个字节的实际消息。这样,您的recv调用可以循环,直到它读取正确的数量。更重要的是,当它们背靠背发送时,它不会尝试读取下一个数据包。

或者,如果您的数据包足够小,您可以选择UDP。它打开了另一种蠕虫病毒,但是你知道recv只会收到一个带UDP的数据包。

相关问题