2016-05-18 8 views
0

このコードはpy2で使用されていました。 PY3では私はこの取得:ここ暗号化py2で行われたように、ランダムなget_random_bytesがpy3で動作していません。

console

をコードです:

from Crypto import Random 
import os 

def generate_random_bytes(length): 
    return Random.get_random_bytes(length) 
    #return bytearray(os.urandom(length)) I tried this line but got the same result 

def generate_server_id(): 
    """Generates 20 random hex characters""" 
    print(generate_random_bytes(10)) 
    print(ord(c) for c in generate_random_bytes(10)) 
    return "".join("%02x" % ord(c) for c in generate_random_bytes(10)) 
+0

はPY3にバイト配列の項目が既にある、ちょうど 'C'と '' ORD(c)を置き換えます文字の代わりに整数なので、変換は必要ありません。 –

答えて

1

ただ、バイト配列の項目が既に整数の代わりに文字であるので、あなたPY3に、cord(c)を置き換えます変換は必要ありません。

あなたはそれが両方のバージョンで動作させるためには、このようにそれを書き換えすることもできます。

def generate_server_id(): 
    """Generates 20 random hex characters""" 
    try: 
     return "".join("%02x" % ord(c) for c in generate_random_bytes(10)) 
    except TypeError: 
     return "".join("%02x" % c for c in generate_random_bytes(10)) 
+0

'six.iterbytes'(依存関係として6つある場合)は、潜在的に良いオプションです –

+0

確かにもっとエレガントに見えますが、文脈によりますますよく依存するため、「良い」とは言いません。 –

+0

よくpython3で書かれているようにあなたのコードは次のことを行います:generate_random_bytesを一度呼び出すと、例外が発生し、再び呼び出されます。これは2倍の作業であり、例外処理を行う必要があります。* –

関連する問題