Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.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
Python中的Perl包(';H*';,$value)_Python - Fatal编程技术网

Python中的Perl包(';H*';,$value)

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

我有下面的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 ^: '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