我通過Python在網絡上發送加密音頻。這個應用程序暫時工作,然後打破說它必須是16的倍數。「消息必須是16的倍數」使用Python通過網絡加密音頻
不知道我做錯了什麼。或者在代碼中尋找解決方法。
我會很感激你必須提供
編輯*我相信我有,現在如果有人有興趣考慮看看我做了一個谷歌代碼項目
http://code.google.com/p/mii-chat/
我通過Python在網絡上發送加密音頻。這個應用程序暫時工作,然後打破說它必須是16的倍數。「消息必須是16的倍數」使用Python通過網絡加密音頻
不知道我做錯了什麼。或者在代碼中尋找解決方法。
我會很感激你必須提供
編輯*我相信我有,現在如果有人有興趣考慮看看我做了一個谷歌代碼項目
http://code.google.com/p/mii-chat/
我做了一個代碼的快速掃描。所有消息都是在加密後發送的,所以您發送的總數據是16的倍數,再加上1的命令。到現在爲止還挺好。
在解密端,您將剝離命令,這會給您留下一個再次爲16的倍數的消息。但是,在致電decrypt_my_message
之前,您正在致電msg.strip()
。對strip
的調用可能會通過從開始或結束中刪除字節來破壞您的加密數據。
我會進一步檢查代碼,並編輯此答案,如果我找到其他任何東西。
編輯:
您正在使用空格字符進行填充,我想你的意思是使用strip
調用去除填充。您應該將decrypt_my_message(msg.strip())
更改爲decrypt_my_message(msg).strip()
。
您正在使用TCP發送數據,因此您的協議必然會讓您長期頭痛。我總是使用這種自定義協議在我的消息中發送有效負載的長度,因此接收端可以確定它是否正確接收了消息塊。例如,您可以使用:CMD|LEN(2)|PAYLOAD(LEN)
作爲您的數據框。這意味着,一個字節的命令,另外兩個字節告訴服務器有多少字節的預期,以及實際消息的字節數。這樣,你的recv
調用可以循環,直到它讀取正確的數額。更重要的是,它們不會在連接/發送時讀取下一個數據包。
另外,如果你的數據包足夠小,你可以去UDP。它打開了另一個蠕蟲罐,但你知道recv
將只收到一個UDP包。
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的塊。
看起來像ed。可能是正確的,但在未來總是發佈完整的追溯。 – agf