English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Введение: Давно не писал в блоге, в последнее время чувствую, что очень занят, все kinds of работы, которые нужно сделать. Я уверен, что многие работники офисов будут чувствовать так же. Недавно работал с NFC для записи карты, нужно вычислить контрольный бит. В большинстве случаев контрольный бит обычно вычисляется с помощью операции иксор предыдущих нескольких байт.
Теперь я сначала расскажу о своем использовании сцены:
Записать 16-битные данные на карту процессора (например, транспортную карту), последний байт - это контрольная сумма - все предыдущие 15 байт выполняют операцию иксор.
Я начал искать в Интернете другие написанные алгоритмы, но после вычислений результаты были неправильными, или они были слишком сложными, поэтому я написал один сам, который, на мой взгляд, также прост, и теперь я хочу поделиться им с вами, чтобы мы могли обсудить это вместе.
Первый раздел: Что такое операция иксор (главным образом摘自 Википедия, те, кто熟悉, могут пропустить)
Определение:
Иксор, англ. exclusive OR, или сокращенно xor
Исключающее ИЛИ (xor) - это математический оператор. Он используется в логических операциях. Математический символ исключающего ИЛИ (XOR) - «⊕», символ компьютера - «xor». Правила выполнения:
a ⊕ b = (¬a ∧ b) ∨ (a ∧ ¬b)
Если значения a и b различаются, результат исключающего ИЛИ (XOR) равен 1. Если значения a и b одинаковы, результат исключающего ИЛИ (XOR) равен 0.
Исключающее ИЛИ (XOR) также называется полусуммой, правила выполнения его аналогичны без кармана двоичному сложению: в двоичном представлении 1 используется для обозначения истинного значения, 0 - ложного, правила выполнения исключающего ИЛИ (XOR): 0 ⊕ 0 = 0, 1 ⊕ 0 = 1, 0 ⊕ 1 = 1, 1 ⊕ 1 = 0 (одинаковы 0, различны 1), эти правила аналогичны правилам сложения, только без кармана.
Исключающее ИЛИ (XOR) сокращенно называется XOR, EOR, EX-OR
В программе есть три оператора: XOR, xor, ⊕.
Метод использования:
z = x ⊕ y
z = xxory
Правила выполнения:
1. a ⊕ a = 0
2. a ⊕ b = b ⊕ a
3. a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
4. d = a ⊕ b ⊕ c можно вывести a = d ⊕ b ⊕ c.
5. a ⊕ b ⊕ a = b.
6. Если x - это двоичное число 0101, y - это двоичное число 1011
Тогда x ⊕ y = 1110
Результат равен 1 только в том случае, если сравниваемые биты различаются, в противном случае результат равен 0
То есть «результат равен 0, если два входа одинаковы, а 1, если они различаются»!
Логика:
Логическое выражение: F = AB' ⊕ A'B ( (AB' ⊕ A'B) '= AB ⊙ A'B', ⊙ является операцией «согласно или»)
Логическая таблица истинности операции исключающего ИЛИ (XOR) показана на рисунке 1.
Показано, что его логический символ показан на рисунке 2. Логическая связь исключающего ИЛИ (XOR): когда A и B различаются, выход P = 1; когда A и B одинаковы, выход P = 0. «⊕» является символом операции исключающего ИЛИ (XOR), логическая операция исключающего ИЛИ (XOR) также является комбинацией логической операции ИЛИ, И, НЕ. Логическое выражение:
P = A ⊕ B
Из рисунка 1 можно увидеть, что правила операции исключающего ИЛИ (XOR):
0 ⊕ 0 = 0, 0 ⊕ 1 = 1
1 ⊕ 0 = 1, 1 ⊕ 1 = 0
Мnemonic: одинаковые биты дают 0, различные биты дают 1
Фактически, XOR в английском языке定义为 'either one (is one), but not both', то есть когда только один из них истинен (1), результат также истинен (1).
Использование:
Этот метод широко используется в компьютерах, логический символ исключающего ИЛИ (XOR) обычно обозначается как xor, а также как ⊕:
Истина ⊕ ложь = истина
Ложь ⊕ истина = истина
Ложь ⊕ ложь = ложь
Истина ⊕ истина = ложь
Или другими словами:
True ⊕ False = True
False ⊕ True = True
False ⊕ False = False
True ⊕ True = False
В некоторых языках программирования 1 используется для обозначения истинного значения, а 0 - ложного, поэтому два байта выполняются битово по правилу исключающего ИЛИ следующим образом:
Ниже приведена операция исключающего ИЛИ (XOR) для двух двоичных чисел:
В реальности используются десятичные числа, поэтому давайте посмотрим, как выполняется операция исключающего ИЛИ (XOR) для двух десятичных чисел:
5⊕2=?
1. Перед выполнением исчисления исключительного или значения都将 преобразовываться в двоичное представление:
5 и 2 представляют собой двоичные числа: 0101 и 0010
2. Переведем результат 0111 в десятичное: 7
3. Таким образом, 5⊕2=7
Изящное использование:
В отличие от других языков, в языках C и C++ исключительное или не используется xor,而是 "^", вводится с помощью Shift+6. (А в других языках "^" обычно означает возведение в степень)
Если нужно обменять значения двух переменных, кроме обычного использования промежуточной переменной для обмена, можно использовать исключительное или, чтобы обменять значения двумя переменными, например:
a=a^b; b=b^a; a=a^b;
Объяснение:
a1=a^b b=a1^b a=a1^b=a1^(a1^b)=a1^a1^b=b
Внимание:
a=a^b^(b=a); //such form is incorrect UB behavior, it will have different results in different compilers, do not use
Таким образом, был произведен обмен между a и b.
Таким образом: исключительное или одного и того же переменного с исключительным или другого переменного и его исключительного или равно этому переменному.
Пример использования: может быть использован на одном или нескольких этапах алгоритма шифрования, чтобы сделать алгоритм более сложным и трудным для взлома,提高了 безопасность.[1]
第二节:Реализация на языке Java:
private static String xor(String strHex_X, String strHex_Y) { // преобразование x и y в двоичное представление String anotherBinary=Integer.toBinaryString(Integer.valueOf(strHex_X,16)); String thisBinary=Integer.toBinaryString(Integer.valueOf(strHex_Y,16)); String result = ""; // проверка на 8-битное двоичное число, в противном случае добавление нулей слева if(anotherBinary.length() != 8) { for (int i = anotherBinary.length(); i <8; i++) { anotherBinary = "0"+anotherBinary; } } if(thisBinary.length() != 8) { for (int i = thisBinary.length(); i <8; i++) { thisBinary = "0"+thisBinary; } } // исчисление исключительного или for (int i=0; i<anotherBinary.length(); i++) { //Если значения в одинаковых позициях одинаковы, добавьте 0, в противном случае добавьте 1 if(thisBinary.charAt(i) == anotherBinary.charAt(i)) result += "0"; else{ result += "1"; } } Log.e("code",result); return Integer.toHexString(Integer.parseInt(result, 2)); }
Внимание: вышеуказанный метод предназначен для операции xor между одним байтом шестнадцатеричной строки, например, для операции xor шестнадцатеричной строки из пятнадцати байт:
1312f70f900168d900007df57b4884
Сначала выполните разделение: 13 12 f7 0f 90 01 68 d9 00 00 7d f5 7b 48 84
13 xor 12 --> 1
1 xor f7 --> f6
f6 xor 0f --> f9
....
62 xor 84 --> e6
То есть, полученный一字节的 контрольный код составляет: e6
Дополнительно, для некоторых друзей был добавлен простой метод вызова,仅供参考:
public String checkcode_0007(String para){ String[] dateArr = new String[15]; try { dateArr[0] = para.substring(0, 2); dateArr[1] = para.substring(2, 4); dateArr[2] = para.substring(4, 6); dateArr[3] = para.substring(6, 8); dateArr[4] = para.substring(8, 10); dateArr[5] = para.substring(10, 12); dateArr[6] = para.substring(12, 14); dateArr[7] = para.substring(14, 16); dateArr[8] = para.substring(16, 18); dateArr[9] = para.substring(18, 20); dateArr[10] = para.substring(20, 22); dateArr[11] = para.substring(22, 24); dateArr[13] = para.substring(26, 28); dateArr[14] = para.substring(28, 30); catch (Exception e) { } // TODO: обработка исключений String code = ""; } for (int i = 0; i < dateArr.length-1; i++) { if (i == 0) { code = xorString(dateArr[i], dateArr[i+1]); else { } code = xorString(code, dateArr[i]); } } return code; }
Затем вызовите это в main функции или другом методе:
String code = checkcode_0007("1312f70f900168d900007df57b4884");
code - это полученный контрольный код.
Обобщение
Вот весь пример кода для реализации алгоритма XOR для шестнадцатеричных строк в Java, который мы рассмотрели в этой статье. Надеюсь, это поможет вам. Те, кто интересуется, могут продолжить читать другие связанные темы на этом сайте, и если есть недостатки, пожалуйста, оставляйте комментарии. Спасибо за поддержку нашего сайта!
Объявление: содержимое статьи взято из Интернета, авторские права принадлежат соответствующему владельцу, материалы предоставлены пользователями Интернета, веб-сайт не имеет права собственности, материалы не редактировались вручную, и не несут ответственности за соответствующие юридические вопросы. Если вы обнаружите материалы,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. При обнаружении фактов нарушения, сайт немедленно удаляет涉嫌侵权的内容.