1

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

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

我将不胜感激您提供的任何帮助

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

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

4

2 回答 2

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)然后以 msg.strip() 作为参数调用 decrypt_my_message。然后decrypt_my_message 抱怨给它一个长度不是16 倍数的字符串。(我猜这是问题所在。查看回溯,看看这是否是导致异常的行)。

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

您可能需要重新考虑读取流的逻辑 - 或者在中间有一些东西来缓冲对 decrypt_my_message 的调用到 n*16 的块中。

于 2011-10-02T19:11:45.780 回答
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 的数据包。

于 2011-10-02T19:17:34.610 回答