2016-03-27 24 views
-2

H、Pythonで2つの文字列(最初は16進数になるはずです)をXORしようとしています。 は、私は1つの方法は、動作します知っている:Pythonで2つの文字列をXORする方法

def xor_two_str(str1, str2): 
    return hex(int(str1,16)^int(str2,16)) 

しかし、私はこのようにSTHを試してみました:これは例外TypeErrorを返します

def change_to_be_hex(str): 
    return hex(int(str,base=16)) 
def xor_two_str(str1,str2): 
    a = change_to_be_hex(str1) 
    b = change_to_be_hex(str2) 
    return hex(a^b) 
print xor_two_str("12ef","abcd") 

:^ strの間で使用すべきではない、STRを。 私は理由を知らない。

そして

また、この機能は動作しません。

bcd = change_to_be_hex("12ef") 
def increment_hex(hex_n): 
    return hex_n + 1 
result = increment_hex(bcd) 
print result 

エラーメッセージです:例外TypeError: 'STR' と「int型私は、これはとても奇妙であると感じ オブジェクト連結することはできません:(

ありがとう

+1

n1c9 @彼はn1c9 @バイトのXOR演算子ではなく、電力事業者 – xvan

+0

を意味うーんはい、それは私が修正立つ – jDo

+0

です! – n1c9

答えて

1

こんにちは hex()の結果はreturns a stringです。

def change_to_be_hex(str): 
    return hex(int(str,base=16)) 

整数には^演算子を使用する必要があります。

def change_to_be_hex(str): 
    return int(str,base=16) 

def xor_two_str(str1,str2): 
    a = change_to_be_hex(str1) 
    b = change_to_be_hex(str2) 
    return hex(a^b) 
print xor_two_str("12ef","abcd") 

私はそれがあなたが探している結果ですが確信していません。 2つの文字列をXORする場合は、ある文字列の各文字を他の文字列とXORする必要があることを意味します。次に、XOR ord()各charまたはstr1の値をord() str2の各charの値に設定する必要があります。

def xor_two_str(a,b): 
    xored = [] 
    for i in range(max(len(a), len(b))): 
     xored_value = ord(a[i%len(a)])^ord(b[i%len(b)]) 
     xored.append(hex(xored_value)[2:]) 
    return ''.join(xored) 

print xor_two_str("12ef","abcd") 

または1つの行に:

def xor_two_str(a,b): 
    return ''.join([hex(ord(a[i%len(a)])^ord(b[i%(len(b))]))[2:] for i in range(max(len(a), len(b)))]) 

print xor_two_str("12ef","abcd") 
0

は、あなたが最初にchange_to_be_hexでのように、進を返すとき、あなたは明示的intに変換あなたのコードがそれに何かを追加するために全体のことをあなたがする必要がある - !。そう、を変更10〜:

return (int(hex_n) + 1) 
+2

が認識されました。ビット単位のxoring操作です。 – pixis

+0

あなたは '4^5'を試しましたか?あなたは何を知っていますか?エラーはありません。 '^ 'は認識されるだけでなく、OPが望むものと非常に似ています。 – zondo

+0

ok、ok - これを反映するように編集しました。ありがとう。 – n1c9

0

hex文字列を返すので、2つの文字列をxorしようとしています。

def change_to_be_hex(str): 
    return int(str,base=16) 

これを修正する必要があります。

関連する問題