Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
像object这样的字节是必需的/ord()应为长度为1的字符串,但找到int(python 3.6)_Python_Encryption_Ord - Fatal编程技术网

像object这样的字节是必需的/ord()应为长度为1的字符串,但找到int(python 3.6)

像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

我正努力与以下方面合作:

我陷入了一个错误循环。第一个修复导致另一个,而另一个修复导致第一个。代码都可以在git链接的tplink-smartplug.py中找到

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的链接。非常感谢您的全面回复!肯定有帮助。然而,我不能提高投票率,因为我没有足够的声誉。