43

Pythonで16進数をXORするにはどうすればよいですか?たとえば、XORを実行したい場合'ABCD''12EF'答えは。になります'B922'

以下のコードを使用しましたが、間違った結果になります。

# xor two strings of different lengths
def strxor(a, b):
    if len(a) > len(b):
        return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
    else:
        return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])

key = '12ef'
m1 = 'abcd'
print(strxor(key, m1))
4

5 に答える 5

114

うわあ。あなたは本当に非常に長い距離でそれを複雑にしすぎています。試す:

>>> print(hex(0x12ef ^ 0xabcd))
0xb922

少なくとも、次の便利な事実を無視しているようです。

  • 0xPython は、接頭辞付きの 16 進数の整数リテラルをネイティブでサポートしています。
  • 「16 進数」は単なるプレゼンテーションの詳細です。演算は 2 進数で行われ、結果は 16 進数として出力されます。
  • 入力 (16 進数リテラル) の形式と出力の間には関係がありません。Python 変数には「16 進数」などはありません。
  • このhex()関数を使用して、任意の数値を表示用の 16 進数文字列に変換できます。

すでに数値を文字列として持っている場合はint()、予想される基数 (16 進数の場合は 16) を指定することで、関数を使用して数値に変換できます。

>>> print(int("12ef", 16))
4874

したがって、2 つの変換を行い、XOR を実行してから、16 進数に戻すことができます。

>>> print(hex(int("12ef", 16) ^ int("abcd", 16)))
0xb922
于 2012-06-20T12:34:19.887 に答える
10

2 つの 16 進文字列が同じ長さで、16 進文字列の出力が必要な場合は、これを試してください。

def hexxor(a, b): # 同じ長さの 2 つの 16 進文字列の xor
    return "".join(["%x" % (int(x,16) ^ int(y,16)) for (x, y) in zip(a, b)])
于 2012-11-30T15:01:46.933 に答える
5

ここにもっと良い機能があります

def strxor(a, b):     # xor two strings of different lengths
    if len(a) > len(b):
        return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
    else:
        return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])
于 2014-01-06T07:04:00.763 に答える
5

文字列が同じ長さの場合'%x' % ()、組み込みの xor ( ^) を使用します。

例 -

>>>a = '290b6e3a'
>>>b = 'd6f491c5'
>>>'%x' % (int(a,16)^int(b,16))
'ffffffff'
>>>c = 'abcd'
>>>d = '12ef'
>>>'%x' % (int(a,16)^int(b,16))
'b922'

文字列が同じ長さでない場合は、スライスを使用して長い文字列を短い文字列の長さに切り詰めます。longer = longer[:len(shorter)]

于 2014-10-06T05:37:49.030 に答える