像object这样的字节是必需的/ord()应为长度为1的字符串,但找到int(python 3.6)
我正努力与以下方面合作: 我陷入了一个错误循环。第一个修复导致另一个,而另一个修复导致第一个。代码都可以在git链接的tplink-smartplug.py中找到像object这样的字节是必需的/ord()应为长度为1的字符串,但找到int(python 3.6),python,encryption,ord,Python,Encryption,Ord,我正努力与以下方面合作: 我陷入了一个错误循环。第一个修复导致另一个,而另一个修复导致第一个。代码都可以在git链接的tplink-smartplug.py中找到 cmd = "{\"system\":{\"set_relay_state\":{\"state\":0}}}" sock_tcp.send(encrypt(cmd)) def encrypt(string): key = 171 r
cmd = "{\"system\":{\"set_relay_state\":{\"state\":0}}}"
sock_tcp.send(encrypt(cmd))
def encrypt(string):
key = 171
result = "\0\0\0\0"
for i in string:
a = key ^ ord(i)
key = a
result += chr(a)
return result
事实上,result='208;òÿ÷ÕÕÕùùòòòòòÿÿùòùùòòòòòòòòòòò242
需要类似字节的对象,而不是“str”
因此,我也更改了函数调用:
sock_tcp.send(encrypt(cmd.encode('utf-8')))
我的错误也会改变:
ord应为长度为1的字符串,但找到int
我理解ord试图做什么,我理解编码。但我不明白的是…如果我不能给编译器它想要的东西,我应该如何将这个加密消息发送到我的智能插件?附近有工作吗?我很确定最初的git是用Python2或更早的版本编写的。也许我没有正确地转换成Python 3
感谢阅读,非常感谢您的帮助。在Python2中,encode的结果是一个str字节字符串,它是一个由1字节str值组成的序列。所以,当你对字符串中的i进行运算时,每个i都是一个str,你必须调用ordi将它转换成一个从0到255的数字 在Python3中,encode的结果是一个字节字符串,它是一个1字节整数序列。因此,当您对字符串中的i执行操作时,每个i都已经是0到255之间的整数,因此您不必做任何转换。而且,如果你尝试这样做,你会得到你看到的打字错误 同时,您正在将结果构建为str。在Python2中,这很好,但在Python3中,这意味着它是Unicode,而不是字节。因此,您会看到另一个类型错误 有关如何将Python2字符串处理代码移植到Python3的更多详细信息,您应该特别阅读《移植指南》,如果需要更多背景知识,还可以阅读《移植指南》 对于Python 2和Python 3,编写代码的一种方法是对这两个值使用bytearray:
def encrypt(string):
key = 171
result = bytearray(b"\0\0\0\0")
for i in bytearray(string):
a = key ^ i
key = a
result.append(a)
return result
cmd = u"{\"system\":{\"set_relay_state\":{\"state\":0}}}"
sock_tcp.send(encrypt(cmd.encode('utf-8')))
注意cmd上的u前缀,它确保即使在python2中也是Unicode,result上的b前缀确保即使在python3中也是bytes。虽然您知道cmd是纯ASCII,但只需执行以下操作可能会更简单:
cmd = b"{\"system\":{\"set_relay_state\":{\"state\":0}}}"
sock_tcp.send(encrypt(cmd))
如果您不关心Python2,您可以只使用字符串形式的i:而不将其转换为bytearray,但您可能仍然希望使用一个bytearray作为结果。能够将int直接附加到它使代码更简单,而且效率更高,这是一个很好的奖励。请给我们完整的回溯,而不仅仅是消息。您应该加密字节,不是文本。为什么不对加密的结果进行编码而不是将字节传递给它呢?@Madpysicator他的加密算法对于加密Unicode代码点而不是字节没有那么大的用处,所以我认为按照他所做的顺序来做是有意义的。这里很新。我不确定我能发布多少文档。这就是为什么我发布了git的链接。非常感谢您的全面回复!肯定有帮助。然而,我不能提高投票率,因为我没有足够的声誉。