我在Python中通过网络发送加密音频。这个应用程序暂时工作然后打破说它必须是16的倍数。
不确定我做错了什么。或者在哪里查看代码来解决这个问题。
感谢您提供的任何帮助
编辑*我相信如果有人有兴趣看看我做了一个谷歌代码项目,我现在有它的工作
答案 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的数据包。