English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Premessa: Non ho scritto un blog da molto tempo, negli ultimi due anni sono stato veramente忙, con lavoro dopo lavoro che non finisce mai. Credo che molti lavoratori in ufficio abbiano questa sensazione. Recentemente, ho eseguito operazioni di scrittura NFC, è necessario calcolare un bit di controllo. Di solito, il bit di controllo è calcolato tramite l'operazione XOR di alcuni byte precedenti.
Per prima cosa, parliamo del mio scenario d'uso:
Scrivere un dati di 16 byte su una scheda CPU (ad esempio, una carta di trasporto), l'ultimo byte è il codice di controllo - XOR dei precedenti quindici byte.
Ho iniziato a cercare su Internet alcuni algoritmi scritti da altri, ho scoperto che i risultati calcolati non erano corretti o erano troppo complessi, quindi ho scritto uno da solo, che penso sia anche abbastanza semplice, lo condivido con tutti voi, sperando di scambiare alcune idee.
Sezione 1: Cos'è l'operazione XOR (principalmente estratto da Baidu Baike, i ragazzi che lo conoscono possono saltare)
Definizione:
E XOR, in inglese si chiama exclusive OR, o abbreviato in xor
L'operatore XOR (xor) è un operatore matematico. Viene utilizzato nelle operazioni logiche. Il simbolo matematico dell'XOR è “⊕”, il simbolo computerizzato è “xor”. Le sue regole di calcolo sono:
a XOR b = (¬a ∧ b) ∨ (a ∧ ¬b)
Se i due valori a e b sono diversi, il risultato dell'XOR è 1. Se i due valori a e b sono uguali, il risultato dell'XOR è 0.
L'operazione XOR è anche chiamata somma semplificata, le sue regole di calcolo sono equivalenti a una somma binaria senza carry: nel sistema binario, 1 rappresenta la verità e 0 la falsità, quindi le regole di calcolo dell'XOR sono: 0 XOR 0 = 0, 1 XOR 0 = 1, 0 XOR 1 = 1, 1 XOR 1 = 0 (uguali sono 0, diversi sono 1), queste regole sono le stesse dell'addizione, ma senza carry.
L'operazione XOR è abbreviata in XOR, EOR, EX-OR
Nel programma ci sono tre operatori: XOR, xor, ⊕.
Modo d'uso:
z = x XOR y
z = xx or y
Regole di calcolo:
1. a XOR a = 0
2. a XOR b = b XOR a
3. a XOR b XOR c = a XOR (b XOR c) = (a XOR b) XOR c;
4. d = a XOR b XOR c può dedurre a = d XOR b XOR c.
5. a XOR b XOR a = b.
6. Se x è il numero binario 0101, y è il numero binario 1011
Quindi x XOR y = 1110
Il risultato è 1 solo quando i bit confrontati sono diversi, altrimenti il risultato è 0
Dunque, 'due input identici sono 0, diversi sono 1'!
Logica:
Espressione logica: F = AB' XOR A'B ( (AB' XOR A'B) ' = AB ⊙ A'B', ⊙ è l'operazione di 'o esclusivo').
La tabella di verità della logica XOR è illustrata nella figura 1
Mostre, il suo simbolo logico è come nella figura 2. La relazione logica dell'XOR è: quando A e B sono diversi, l'uscita P = 1; quando A e B sono uguali, l'uscita P = 0. “⊕” è il simbolo di operazione XOR, e la logica XOR è una combinazione di logica AND, OR e NOT, la sua espressione logica è:
P = A XOR B
Dalla figura 1 si può notare che le regole dell'operazione XOR sono
0 XOR 0 = 0, 0 XOR 1 = 1
1 XOR 0 = 1, 1 XOR 1 = 0
Dettagli della tecnica: per valori identici si prende 0, per valori diversi si prende 1
In effetti, XOR in inglese è definito come 'either one (is one), but not both', ossia c'è solo una che sia vera (1) quando si prende la verità (1).
Funzione:
Viene utilizzato in modo comune nei computer, il simbolo logico XOR generalmente utilizzato è xor, ma può essere anche ⊕:
Verità XOR falsità = verità
Falsità XOR verità = verità
Falsità XOR falsità = falso
Verità XOR verità = falso
O in altre parole:
True XOR False = True
False XOR True = True
False XOR False = False
True XOR True = False
Alcuni linguaggi di programmazione utilizzano 1 per rappresentare la verità e 0 per rappresentare la falsità, quindi l'operazione XOR bit a bit tra due byte è la seguente:
Di seguito è riportato un esempio di calcolo XOR su due numeri binari:
Nella realtà si utilizzano numeri decimali, quindi vediamo come due numeri decimali eseguono un calcolo XOR:
5⊕2=?
1. Prima di eseguire il calcolo XOR, convertire i numeri in binario:
5 e 2 convertiti in binario sono rispettivamente: 0101, 0010
2. Convertire il risultato 0111 in decimale: 7
3. Quindi 5⊕2=7
Utilizzo intelligente:
Diversamente da altri linguaggi, nel linguaggio C e C++ l'operazione XOR non si usa come xor, ma con "^", la tastiera è Shift+6.(mentre il "^" di altri linguaggi generalmente rappresenta la potenza)
Se si desidera scambiare i valori di due variabili, oltre all'uso comune di un variabile intermedia per lo scambio, si può anche utilizzare XOR, scambiando con due variabili, come:
a=a^b; b=b^a; a=a^b;
Spiegazione:
a1=a^b b=a1^b a=a1^b=a1^(a1^b)=a1^a1^b=b
Attenzione:
a=a^b^(b=a);//questo tipo di forma è un comportamento UB non corretto, può avere risultati diversi su diversi compilatori, non utilizzare.
Così si completa lo scambio tra a e b.
In sintesi: XOR di una variabile con il XOR di un'altra variabile e il XOR di sé stessa è uguale alla variabile stessa.
Esempio di utilizzo: può essere utilizzato in una fase o più fasi di un algoritmo di crittografia, rendendo l'algoritmo più complesso, più difficile da decifrare e più sicuro.[1]
Seconda sezione: implementazione in linguaggio java:
private static String xor(String strHex_X,String strHex_Y){ //trasformare x e y in forma binaria String anotherBinary=Integer.toBinaryString(Integer.valueOf(strHex_X,16)); String thisBinary=Integer.toBinaryString(Integer.valueOf(strHex_Y,16)); String result = ""; //giudizio se è un binario di 8 bit, altrimenti riempire a sinistra con zero 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; } } //operazione XOR for (int i=0;i<anotherBinary.length();i++){ //Se i numeri alle posizioni corrispondenti sono uguali, aggiungi 0, altrimenti aggiungi 1 if(thisBinary.charAt(i)==anotherBinary.charAt(i)) result+="0"; else{ result+="1"; } } Log.e("code",result); return Integer.toHexString(Integer.parseInt(result, 2)); }
Attenzione: il metodo sopra descritto si applica all'operazione di XOR tra byte consecutivi di una stringa esadecimale, come per esempio l'operazione XOR su una stringa esadecimale di 15 byte:
1312f70f900168d900007df57b4884
Esegui prima la separazione: 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
Ecco, il byte di codice di verifica ottenuto è: e6
Aggiungi, per alcuni amici, un metodo di chiamata semplice, da considerare solo come esempio:
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[12] = para.substring(24, 26); dateArr[13] = para.substring(26, 28); dateArr[14] = para.substring(28, 30); } catch (Exception e) { // TODO: gestire l'eccezione } 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; }
Poi chiamalo nel main o in altri metodi:
String code = checkcode_0007("1312f70f900168d900007df57b4884");
code è il codice di controllo ottenuto.
Sommario
Questo è tutto il contenuto dell'esempio di codice di implementazione dell'operazione XOR di stringa esadecimale in Java menzionato in questo articolo. Spero che sia utile per tutti. Chi è interessato può continuare a leggere altri argomenti correlati su questo sito. Se ci sono difetti, vi preghiamo di lasciare un messaggio. Grazie per il supporto degli amici di questo sito!
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, è proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato elaborato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.