1

そのため、さまざまな16進文字列をxorし、それらを通常の英語の文字列に変換してから、16進文字列に再変換するという問題があります。ただし、意味のある方法で hex または xor を操作することにあまり慣れていません。ビット単位の xor 演算を実行する前に、16 進数をバイナリまたはユニコードに変換する必要がありますか? もしそうなら、それが終わったらどうすれば16進値を取得できますか? str.encode('hex') と str.decode('hex') の使用を検討していますが、16 進数以外の文字を使用しているというエラーが表示され続けます。要するに、私は完全に迷っています。

4

2 に答える 2

1

Python には整数用の XOR 演算子があります: ^. 使用方法は次のとおりです。

>>> hex(int("123abc", 16) ^ int("def456", 16))
'0xccceea'

編集:コメントに従って長い16進文字列でテストします:

>>> def hexor(hex1, hex2):
...     """XOR two hex strings."""
...     xor = hex(int(hex1, 16) ^ int(hex2, 16))
...     return xor[2:].rstrip("L")  # get rid of "0x" and maybe "L"
... 
>>> import random
>>> a = "".join(random.choice("0123456789abcdef") for i in range(200))
>>> b = "".join(random.choice("0123456789abcdef") for i in range(200))
>>> a
'8db12de2f49f092620f6d79d6601618daab5ec6747266c2eea29c3493278daf82919aae6a72
64d4cf3dffd70cb1b6fde72ba2a04ac354fcb871eb60e088c2167e73006e0275287de6fc6133
56e44d7b0ff8378a0830d9d87151cbf3331382b096f02fd72'
>>> b
'40afe17fa8fbc56153c78f504e50a241df0a35fd204f8190c0591eda9c63502b41611aa9ac2
27fcd1a9faea642d89a3a212885711d024d2c973115eea11ceb6a57a6fa1f478998b94aa7d3e
993c04d24a0e1ac7c10fd834de61caefb97bcb65605f06eae'
>>> hexor(a, b)
'cd1ecc9d5c64cc47733158cd2851c3cc75bfd99a6769edbe2a70dd93ae1b8ad36878b04f0b0
43281e94053d689c3f5e45392af75b13702e7102fa3e0a990ca0db096fcff60db1f672561c0d
cfd849a945f62d4dc93f01ecaf30011c8a6849d5f6af293dc'
于 2012-11-13T15:45:36.430 に答える
1

@ user1427661: 入力の 1 つ (input1 など) と同じ出力が表示されます。

len(入力1) > len(入力2)

あなたが今できることは、2つの文字列の長さにチェックを適用し、大きい方を剥がして小さい方のサイズに合わせることです(残りの部分はとにかく役に立たないため)次のようなものです-

len(input1) > len(input2) の場合:

          input1 = input1[:len(b)]

同様に、else 条件です。

もっと簡単な答えを教えてください(もちろん私の意見では!)。組み込みの「operator」パッケージを使用してから、その中で xor メソッドを直接使用できます。

http://docs.python.org/2/library/operator.html

お役に立てれば。

于 2012-11-28T03:12:56.750 に答える