我需要将C中的这个函数转换为Python:
void myencrypt(char password[],int mkey)
{
unsigned int i;
for(i=0;i<strlen(password);++i)
{
password[i] = password[i] - mkey;
}
}
我试试这个,但失败了......
def myencrypt(password, mkey):
i = 0
newpass = []
for i in range(len(password)):
newpass[i] = ord(password[i]) - mkey;
return newpass
任何帮助?
答案 0 :(得分:2)
在Python中,如果列表足够长,则只能分配给列表中的索引,否则会出现IndexError。请尝试以下方法:
def myencrypt(password, mkey):
i = 0
newpass = []
for i in range(len(password)):
newpass.append(ord(password[i]) - mkey)
return newpass
通过使用newpass.append()
,您只需将每个新元素添加到列表的末尾。作为旁注,您可以直接迭代password
的元素,这更简洁:
def myencrypt(password, mkey):
newpass = []
for x in password:
newpass.append(ord(x) - mkey)
return newpass
答案 1 :(得分:2)
C代码正在修改password
。所以,最接近的等价物是:
def myencrypt(password, mkey):
for i in range(len(password)):
password[i] = chr(ord(password[i]) - mkey)
假设password
是list
个字符,而不是字符串。
另外,请注意我在每个chr
的结果上调用ord(password[i]) - mkey
,因为否则您要用数字替换每个字符 - 例如,myencrypt(['a'], 32)
会给你[65]
代替['A']
。 (这在C中不是必需的,因为65
和'A'
在C中是相同的值。)
您更有可能想要使用字符串调用此函数,并返回一个字符串。你可以仍然使用C风格的就地功能来做,只需转换并转换回来:
def myencrypt(password, mkey):
newpass = list(password)
for i in range(len(newpass)):
newpass[i] = chr(ord(newpass[i]) - mkey)
return ''.join(newpass)
然而,这不是一种非常恐怖的做事方式。一个更惯用的解决方案是:
def myencrypt(password, mkey):
return ''.join(chr(ord(ch) - mkey) for ch in password)
这提出了一个更普遍的观点:除非在非常微不足道的情况下,试图直接“将C代码转换为Python”是一个坏主意。相反,弄清楚C代码的作用,编写新的Python代码,以最好的方式完成相同的任务,而不是像C代码那样。
答案 2 :(得分:1)
首先,我不会在此功能中使用“加密”一词。在现代Python中,您可以使用可变的bytearray
对象。然后转换为字符串。
def myobfuscate(password, mkey):
a = bytearray(password)
for i, c in enumerate(password):
a[i] = ord(c) - mkey
return str(a)
myobfuscate("secret", 10)
# OUT: 'i[Yh[j'
在Python中,字符串是不可变的,它们不能就地替换。所以你会使用这样的函数:
pw = myobfuscate(pw, 10)
假设您不再需要原始值。这将使用函数返回的新对象替换原始引用。