Python 2.7中Unicode字符串的XOR

Python 2.7中Unicode字符串的XOR,python,python-2.7,unicode,Python,Python 2.7,Unicode,我正在尝试解码一个模糊的Android应用程序。反编译后,我可以看到几个字符串以这种方式被混淆: static char[] java_decode(char[] cArr, char[] cArr2) { int i = 0; for (int i2 = 0; i2 < cArr.length; i2++) { cArr[i2] = (char) (cArr2[i] ^ cArr[i2]); i++;

我正在尝试解码一个模糊的Android应用程序。反编译后,我可以看到几个字符串以这种方式被混淆:

static char[] java_decode(char[] cArr, char[] cArr2) {
        int i = 0;
        for (int i2 = 0; i2 < cArr.length; i2++) {
            cArr[i2] = (char) (cArr2[i] ^ cArr[i2]);
            i++;
            if (i >= cArr2.length) {
                i = 0;
            }
        }
        return cArr;
    }
str2 = new String(epgwmgrwgrdvzck("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝".toCharArray(), new char[]{'浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '䯃', '倧'})).intern();
# java.lang.String str2 = ": country :"
static char[]java_解码(char[]cArr,char[]cArr2){
int i=0;
for(int i2=0;i2=2.长度){
i=0;
}
}
返回卡尔;
}
str2=新字符串(epgwmgrwgrdvzck(“浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝".toCharArray(),新字符[]{'浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '䯃', '倧'})).实习医生();
#java.lang.String str2=“:国家:
为了更好地理解和快速回顾,我希望将所有这些字符串更改为普通字符串;我选择Python,因为它只是一种快速的脚本语言。
遗憾的是,我在使用这些多字节字符时遇到了一些困难。这是我试图编写的函数:

# coding=utf-8

def decode(string1, string2):
    string1 = list(string1)

    i = 0
    i2 = 0

    while i2 < len(string1):
        string1[i2] = chr(ord(string2[i]) ^ ord(string1[i2]))

        i += 1

        if i >= len(string2):
            i = 0

        i2 += 1

    string1 = str("".join(string1))    
    print string1

    return string1

decode("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝", ['浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '䯃', '倧'])
# TypeError: ord() expected a character, but string of length 3 found
#编码=utf-8
def解码(字符串1、字符串2):
string1=列表(string1)
i=0
i2=0
当i2=len(string2):
i=0
i2+=1
string1=str(“.”连接(string1))
打印字符串1
返回字符串1
解码(“浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝", ['浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '䯃', '倧'])
#TypeError:ord()应为字符,但找到长度为3的字符串
这里的主要问题是
ord()
一次只接受一个字符,而这些字符串由多字节字符组成。
对如何解决这个问题有什么建议吗

我使用的是Python2.7.11 | Anaconda 4.0.0(x86_64)。我知道Python3比Python2具有更好的Unicode支持;如果解决方案只在Python3中工作,我可以毫无问题地使用它,因为它只是一个一次性脚本。

您的代码可以按原样工作(除非您需要将
print string1
更改为
print(string1)
在Python 3中;输出和返回值是字符串
:country:

但是,这在Python2中不起作用,因为在Python2中字符串不是unicode;您需要在所有unicode字符串文本前面加上
u
,即
u'浌'
/或者,您需要使用
from\uuuuu future\uuuuu import unicode\u literals
使“”在Python 2中创建unicode literals;并且
chr
将值转换为8位字符串值(即字节),而不是unicode字符


FWIW,用python3编写代码可能更容易

from itertools import cycle

def decode(s1, s2):
    return ''.join([
        chr(ord(c1) ^ ord(c2))
        for c1, c2 in
        zip(s1, cycle(s2))
    ])

result = decode("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝",
                ['浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '䯃', '倧'])

print(result)  # prints ": country :"
首先,java代码似乎允许第二个数组比第一个数组短,在这种情况下,它的值是重复的;在Python中,我们可以使用
itertools.cycle
更有效地实现这一效果。我们使用
zip
将输入数组中的相应值配对,并使用列表理解来构建ld将提供给
''的列表。加入

这段代码可以在Python 2中进行一些小的修改,通过添加
from\uuuuu future\uuuuu导入unicode\u literals
并将
chr
更改为
unichr

from __future__ import unicode_literals, print_function
from itertools import cycle

def decode(s1, s2):
    return ''.join([
        unichr(ord(c1) ^ ord(c2))
        for c1, c2 in
        zip(s1, cycle(s2))
    ])

result = decode("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝",
                ['浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '䯃', '倧'])

print(result)  # prints ": country :"

该死的,我本来打算添加Python版本,然后我点击了“询问”而没有发布。感谢您提醒iTunes Python 3。这些Python 2字符串类似于Java
byte[]
,其中包含unicode字节。