Python中的Perl包(';H*';,$value)
我有下面的Perl代码,需要用Python重写:Python中的Perl包(';H*';,$value),python,Python,我有下面的Perl代码,需要用Python重写: $varTmp = join( '', pack( "H*", $value ) ); $result = $varTmp ^ $key; $result =~ s/\x00//g; 我想到的是: result = (value.decode('hex') ^ key).replace('\x00', '') 现在,我以错误告终: TypeError: unsupported operand type(s) for
$varTmp = join( '', pack( "H*", $value ) );
$result = $varTmp ^ $key;
$result =~ s/\x00//g;
我想到的是:
result = (value.decode('hex') ^ key).replace('\x00', '')
现在,我以错误告终:
TypeError: unsupported operand type(s) for ^: 'str' and 'str'
有人能帮我正确地做吗?如果我正确地理解了这个问题,$value是一个十六进制数字字符串,例如“303132”,它被转换为一个由十六进制数字对表示的字符串(“303132”->“012”),然后与另一个字符串,$key异或ed 对于Python 2,您需要一种稍微不同的方法:
value = "303132";
key = "\0\0\0";
print "".join( chr(t) for t in ( ord(i) ^ ord(j) for i,j in zip(value.decode("hex"), key) ) if t != 0)
对于Python 3,其中不存在str.decode
,必须使用bytes.fromhex
:
value = "303132";
key = b"\0\0\0"; # b stands for bytes
print("".join( chr(t) for t in ( i ^ j for i,j in zip(bytes.fromhex(value), key) ) if t != 0))
请注意,在第一段
中,key
和value.decode('hex')
的结果是字符串,因此i和j是字符,需要使用ord
将其转换为数字;在第二个例子中,没有这样的需要-key
和字节。fromhex(value)
是bytes
类型,所以i和j已经是整数了。考虑到^
是位异或吗?@DeepSpace是位异或吗?对于那些不熟悉Perl的人来说,你能解释一下代码应该做什么吗?@masklin yes@DeepSpace我的意思是他们可能希望s1^s2
对bytestrings执行位异或。谢谢你@Błotosmętek,看起来我已经完成了一半,但我的钥匙是30和errodnkl5rifnlçpT1pNr9
这样给了我7b}>9美元[e7-▒%
):我认为问题在于你的键是一个Unicode字符串(从“Ô和“§”的存在来判断)。你从来没有说过你使用的是Python 2还是Python 3–它们在处理Unicode时有很大的不同。我使用的是Python 2.7在这种情况下,你可能应该像这样转换你的键:key=key.decode('utf-8')。encode('latin1'))
。这是假设它在UTF-8中,可能不是这样。谢谢你,这很有效,现在我有了正确的结果加上7b}>9$[e7-▒%代码>):o