0

この関数を 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

何か助けはありますか?

4

3 に答える 3

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
于 2013-02-14T01:21:19.457 に答える
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)ます。(C ではとは同じ値であるため、これは C では必要ありません。)[65]['A']65'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 コードが何をするかを理解し、C コードが行った方法ではなく、Python にとって最良の方法で同じタスクを達成する新しい Python コードを作成します。

于 2013-02-14T01:39:19.247 に答える
1

First of all, I wouldn't use the word "encrypt" in this function. In modern Python you can use a bytearray object, that is mutable. Then convert to string.

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'

In Python, strings are immutable, they can't be alterend in-place. So you would use a function like this as:

pw = myobfuscate(pw, 10)

Assuming you won't need the original value any more. This replaces the original reference with a new object that the function returns.

于 2013-02-14T01:29:27.227 に答える