0

i need to convert this function in C to Python:

void myencrypt(char password[],int mkey)
{
    unsigned int i;
    for(i=0;i<strlen(password);++i)
    {
    password[i] = password[i] - mkey;
    }
}

I try this, but fails...

def myencrypt(password, mkey):

    i = 0
    newpass = []

    for i in range(len(password)):
        newpass[i] = ord(password[i]) - mkey;

    return newpass

any help ?

4

3 回答 3

2

C 代码正在password就地修改。因此,最接近的等价物是:

def myencrypt(password, mkey):
    for i in range(len(password)):
        password[i] = chr(ord(password[i]) - mkey)

假设password是一个list字符,而不是一个字符串。

另外,请注意我正在调用chreach 的结果ord(password[i]) - mkey,因为否则您将用数字替换每个字符 - 例如,myencrypt(['a'], 32)会给您[65]而不是['A']. (这在 C 中不是必需的,因为65和在 C'A'中是相同的值。)

你更有可能想要用一个字符串调用这个函数,然后取回一个字符串。您仍然可以使用 C 风格的就地功能来做到这一点,只需转换和转换回来:

def myencrypt(password, mkey):
    newpass = list(password)
    for i in range(len(newpass)):
        newpass[i] = chr(ord(newpass[i]) - mkey)
    return ''.join(newpass)

但是,这不是一种非常 Pythonic 的做事方式。一个更惯用的解决方案是:

def myencrypt(password, mkey):
    return ''.join(chr(ord(ch) - mkey) for ch in password)

这带来了一个更普遍的观点:除了在非常琐碎的情况下,直接尝试“将 C 代码转换为 Python”是一个坏主意。相反,要弄清楚 C 代码做了什么,并编写新的 Python 代码,以最适合 Python 的方式完成相同的任务,而不是按照 C 代码的方式。

于 2013-02-14T01:39:19.247 回答
2

In Python, you can only assign to an index in a list if the list is long enough, otherwise you will get an IndexError. Try the following:

def myencrypt(password, mkey):
    i = 0
    newpass = []
    for i in range(len(password)):
        newpass.append(ord(password[i]) - mkey)
    return newpass

By using newpass.append(), you will just add each new element to the end of the list. As a side note, you can iterate directly over the elements of password which is a bit more concise:

def myencrypt(password, mkey):
    newpass = []
    for x in password:
        newpass.append(ord(x) - mkey)
    return newpass
于 2013-02-14T01:21:19.457 回答
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)

假设您不再需要原始值。这将使用函数返回的新对象替换原始引用。

于 2013-02-14T01:29:27.227 回答