我在 Python 中通过网络发送加密的音频。这个应用程序暂时工作然后中断说它必须是 16 的倍数。
不知道我做错了什么。或者在哪里查看代码来解决这个问题。
我将不胜感激您提供的任何帮助
编辑 * 如果有人有兴趣看看我做了一个谷歌代码项目,我相信我现在可以工作了
我在 Python 中通过网络发送加密的音频。这个应用程序暂时工作然后中断说它必须是 16 的倍数。
不知道我做错了什么。或者在哪里查看代码来解决这个问题。
我将不胜感激您提供的任何帮助
编辑 * 如果有人有兴趣看看我做了一个谷歌代码项目,我相信我现在可以工作了
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 的块中。
我快速扫描了代码。所有消息都是加密后发送的,所以你发送的总数据是 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 的数据包。