서문 : 나는 오랫동안 블로그를 작성하지 않았습니다. 나는 작년에 너무 바빠서 끝없는 일을하고 있습니다. 나는 많은 사무직 노동자들이 이런 식으로 느낄 것이라고 믿는다. 최근에 NFC에서 카드 작성 작업을 수행했으며 수표 비트를 계산해야합니다. 일반적으로, 대부분의 체크 비트는 처음 몇 바이트의 XOR 작동에 의해 얻어집니다.
이제 내가 사용하는 시나리오에 대해 이야기하겠습니다.
16 바이트 데이터를 CPU 카드 (예 : 트래픽 카드)에 작성하고 마지막 바이트는 확인 코드 (처음 15 바이트 XOR입니다.
인터넷에서 다른 사람들이 작성한 알고리즘을 찾기 시작했고 계산 결과가 잘못되었거나 글쓰기가 너무 복잡하다는 것을 알았으므로 직접 썼습니다. 이제 나는 당신과 공유 할 것입니다. 나는 당신과 함께 당신과 의사 소통하기를 바랍니다.
섹션 1 : XOR 작전은 무엇입니까 (주로 Baidu 백과 사전에서 발췌 한, 친숙한 어린이 부츠를 건너 뛸 수 있음)
정의:
독점 자, 영어는 독점적이거나 XOR로 약식입니다
Xor는 수학 연산자입니다. 논리적 작업에 적용됩니다. xor의 수학적 기호는 ""이고 컴퓨터 기호는 "xor"입니다. 알고리즘은 다음과 같습니다.
ab = (¬a¬b) ∨ (a∧ob)
값 a와 b가 동일하지 않으면 xor 결과는 1입니다. 값 a와 b가 동일하면 xor 결과는 0입니다.
독점적이거나 반 딘딩 작업이라고도합니다. 알고리즘은 캐리가없는 이진 첨가와 동일합니다. 이진에서 1은 true를 나타내는 데 사용되고 0은 false이고, 독점적 또는 IS : 00 = 0, 10 = 1, 01 = 1, 11 = 0 (둘 다 0, 다). 이 법률은 추가와 동일하지만 운반되지는 않습니다.
XOR는 XOR, EOR 및 EX-OR이라고합니다
이 프로그램에는 XOR, XOR 및.
사용 방법은 다음과 같습니다
z = xy
z = xxory
운영 규칙 :
1.AA = 0
2.AB = BA
3.ABC = A (BC) = (AB) C;
4.D = ABC는 A = DBC를 추론 할 수 있습니다.
5. 아바 = b.
6. X가 이진 번호 0101 인 경우 y는 이진 번호 1011입니다.
그런 다음 xy = 1110
두 비교 비트가 다를 때만 결과는 1입니다. 그렇지 않으면 결과는 0입니다.
즉, "두 입력이 동일 할 때 0이고, 다르면 1입니다"!
논리:
논리적 표현 : f = ab'a'b ((ab'a'b) '= ab⊙a'b', ⊙는 "동일 또는"작동)입니다.
XOR 논리의 진실 표는 그림 1에 나와 있습니다.
논리 기호는 그림 2에 나와 있습니다. XOR 논리 사이의 관계는 다음과 같습니다. AB가 다를 때 출력 p = 1; AB가 동일 할 때 출력 p = 0. "" "XOR 작동 기호이며 XOR 논리는 또한 비 로거 또는 논리적 표현과 함께 다음과 같습니다.
p = ab
그림 1에서 XOR 운영 규칙은 다음과 같습니다
00 = 0,01 = 1
10 = 1,11 = 0
정신 공식 : 0은 동일하고 1은 동일합니다.
실제로 XOR은 영어로 (isone) 중 하나로 정의되지만, Notboth, 즉 하나만이 사실 일 때 (1)을 취합니다 (1).
효과:
일반적으로 컴퓨터에서 사용됩니다. XOR의 논리적 기호는 일반적으로 Xor와 함께 사용되며 유용합니다.
참 또는 거짓 = 참
거짓 참 = 참
false = false
true = false
또는:
truefalse = true
falsetrue = true
falsefalse = false
truetrue = false
일부 컴퓨터 언어는 1을 사용하여 True를 나타내고 0은 False를 나타 내기 위해 0을 사용하므로 두 바이트는 약간 배타적이거나 다음과 같이 다음과 같습니다.
다음은 XOR 계산을위한 두 가지 이진 값입니다.
실제로 소수점 값이 사용되므로 XOR에 대해 두 가지 소수점 값이 어떻게 계산되는지 살펴 보겠습니다.
52 =?
1. XOR 계산을 수행하기 전에 모든 값이 바이너리로 변환됩니다.
5와 2는 이진 : 0101 및 0010으로 변환됩니다.
2. 결과 0111을 소수점으로 변환하십시오 : 7
3. So 52 = 7
영리한 사용 :
다른 언어와 달리 C 및 C ++의 XOR은 XOR을 사용하지 않지만 "^"이며 입력 메소드는 SHIFT+6입니다. (그리고 다른 언어로 "^"은 일반적으로 곱하기를 의미합니다)
두 변수의 값을 교환 해야하는 경우, 일반적으로 사용되는 빌린 중간 변수 외에도 XOR을 사용하고 다음과 같은 교환에 두 가지 변수 만 사용할 수 있습니다.
a = a^b; b = b^a; a = a^b;
상해:
a1 = a^bb = a1^ba = a1^b = a1^(a1^b) = a1^a1^b = b
알아채다:
a=a^b^(b=a);//此类形式是不正确的UB行为,在不同编译器中会有不同的结果,切勿使用
이것은 a와 b의 교환을 완료합니다.
요약하면 : 동일한 변수와 다른 변수 및 XOR 값은 그 자체와 같습니다.
사용 사례 : 암호화 알고리즘의 특정 링크 또는 더 많은 링크에서 사용할 수 있으므로 알고리즘을보다 복잡하고 갈라지기 쉽고 보안이 높아집니다. [1]
섹션 2 : Java 언어의 구현 :
private static string XOR (String StrHex_X, String StrHex_y) {// X와 Y를 바이너리 양식 문자열로 변환합니다. 다른binary = integer.tobinaryString (integer.valueof (strhex_x, 16)); String thisbinary = integer.tobinarystring (integer.valueof (16); // it) 바이너리, 그렇지 않으면 왼쪽 제로가 (exerbinary.length ()! = 8) {for (int i = elogebinary.length (); i <8; i ++) {exerbinary = "0"+exerbinary;}} if (thisbinary.length ()! = 8) {(int i = thisbinary.length (); i <8; i ++) {i ++). "0"+thisbinary;}} // XOR for (int i = 0; i <everbinary.length (); i ++) {// 동일한 위치의 숫자가 동일하면 0을 추가하고 그렇지 않으면 1을 추가하면 (thisbinary.charat (i) == excerbinary.charat (i)) result+= "0"; else {result+= "1";}} log.e ( "code", result); return integer.tohexstring (integer.parseint (result, 2));}참고 : 위의 방법은 15 바이트 육각형 문자열에 대한 XOR 작동과 같은 16 진수 문자열의 1 바이트 사이의 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
즉, 획득 된 1 바이트 검증 코드는 다음과 같습니다
또한 참조 만 참조를 위해 일부 친구에게 간단한 통화 방법을 추가했습니다.
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 [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 [12] = para.substring (24, 26); datearr [13] = para.substring (26, 28); datearr [14] = para.substring (28,}}} 예외} 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]);}}}}그런 다음 기본 기능 또는 기타 방법으로 호출하십시오.
문자열 코드 = CheckCode_0007 ( "1312F70F900168D900007DF57B4884");
코드는 얻은 체크 코드입니다.
요약
위의 내용은이 기사의 전체 컨텐츠입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!