побитовый XOR шестнадцатеричных чисел в python

как мы можем XOR шестнадцатеричные числа в python, например. Я хочу, чтобы xor 'ABCD' до '12EF'. Ответ должен быть B922.

Я использовал ниже код, но он возвращает значение для мусора

def strxor(a, b): # xor two strings of different lengths 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) 

  • Как XOR две строки, содержащие шестнадцатеричные числа в python?
  • быстрые байты XORing в python 3
  • Как использовать keras для XOR
  • Простая задача Python: быстрый побитовый XOR для буферов данных
  • как xOR двоичный с python
  • Python эквивалент sum () с помощью xor ()
  • 5 Solutions collect form web for “побитовый XOR шестнадцатеричных чисел в python”

    Вау. Вы действительно слишком усложняете это на очень большом расстоянии. Пытаться:

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

    Вы, кажется, игнорируете эти удобные факты, по крайней мере:

    • Python имеет встроенную поддержку шестнадцатеричных целочисленных литералов с 0x .
    • «Шестнадцатеричный» – это просто деталь презентации; арифметика выполняется в двоичном формате, а затем результат печатается как шестнадцатеричный.
    • Нет связи между форматом входных данных (шестнадцатеричными литералами) и выходом, в переменной Python не существует «шестнадцатеричного числа».
    • Функция hex() может использоваться для преобразования любого числа в шестнадцатеричную строку для отображения.

    Если у вас уже есть номера в виде строк, вы можете использовать функцию int() для преобразования в числа, предоставляя ожидаемую базу (16 для шестнадцатеричных чисел):

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

    Таким образом, вы можете сделать два преобразования, выполнить XOR, а затем преобразовать обратно в hex:

     >>> print hex(int("12ef", 16) ^ int("abcd", 16)) 0xb922 

    Если две шестнадцатеричные строки имеют одинаковую длину, и вы хотите получить шестнадцатеричную строку, вы можете попробовать это.

     def hexxor (a, b): # xor две шестнадцатеричные строки одинаковой длины
         return "" .join (["% x"% (int (x, 16) ^ int (y, 16)) для (x, y) в zip (a, b)])
    

    Если строки имеют одинаковую длину, я бы пошел на '%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)]

    вот лучшая функция

     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)])]) 

    Для целей производительности, вот небольшой код для сравнения этих двух альтернатив:

     #!/bin/python def hexxorA(a, b): if len(a) > len(b): return "".join(["%x" % (int(x,16) ^ int(y,16)) for (x, y) in zip(a[:len(b)], b)]) else: return "".join(["%x" % (int(x,16) ^ int(y,16)) for (x, y) in zip(a, b[:len(a)])]) def hexxorB(a, b): if len(a) > len(b): return '%x' % (int(a[:len(b)],16)^int(b,16)) else: return '%x' % (int(a,16)^int(b[:len(a)],16)) def testA(): strstr = hexxorA("b4affa21cbb744fa9d6e055a09b562b87205fe73cd502ee5b8677fcd17ad19fce0e0bba05b1315e03575fe2a783556063f07dcd0b9d15188cee8dd99660ee751", "5450ce618aae4547cadc4e42e7ed99438b2628ff15d47b20c5e968f086087d49ec04d6a1b175701a5e3f80c8831e6c627077f290c723f585af02e4c16122b7e2") if not int(strstr, 16) == int("e0ff3440411901bd57b24b18ee58fbfbf923d68cd88455c57d8e173d91a564b50ce46d01ea6665fa6b4a7ee2fb2b3a644f702e407ef2a40d61ea3958072c50b3", 16): raise KeyError return strstr def testB(): strstr = hexxorB("b4affa21cbb744fa9d6e055a09b562b87205fe73cd502ee5b8677fcd17ad19fce0e0bba05b1315e03575fe2a783556063f07dcd0b9d15188cee8dd99660ee751", "5450ce618aae4547cadc4e42e7ed99438b2628ff15d47b20c5e968f086087d49ec04d6a1b175701a5e3f80c8831e6c627077f290c723f585af02e4c16122b7e2") if not int(strstr, 16) == int("e0ff3440411901bd57b24b18ee58fbfbf923d68cd88455c57d8e173d91a564b50ce46d01ea6665fa6b4a7ee2fb2b3a644f702e407ef2a40d61ea3958072c50b3", 16): raise KeyError return strstr if __name__ == '__main__': import timeit print("Time-it 100k iterations :") print("\thexxorA: ", end='') print(timeit.timeit("testA()", setup="from __main__ import testA", number=100000), end='s\n') print("\thexxorB: ", end='') print(timeit.timeit("testB()", setup="from __main__ import testB", number=100000), end='s\n') 

    Вот результаты:

     Time-it 100k iterations : hexxorA: 8.139988073991844s hexxorB: 0.240523161992314s 

    Кажется, что '%x' % (int(a,16)^int(b,16)) быстрее, чем zip-версия.

    Python - лучший язык программирования в мире.