English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Prefacio: No he escrito en el blog hace mucho tiempo, durante el último año he estado muy ocupado, con mucho trabajo por hacer. Creo que muchos上班族 también tienen esta sensación. Recientemente, al realizar operaciones de escritura NFC, se necesita calcular un bit de verificación. En general, el bit de verificación se obtiene mediante la operación XOR de varios bytes anteriores.
Ahora primero mencionaré el escenario que utilizo:
Poner un16Los datos de bytes se escriben en la tarjeta de CPU (como la tarjeta de transporte), el último byte es el código de verificación---Primeros quince bytes XOR.
Empezaré hablando de mi escenario:
Primer capítulo: ¿Qué es la operación XOR (principalmente extraído de la enciclopedia Baidu, los niños familiarizados pueden saltar)
Definición:
El XOR, en inglés se dice exclusive OR, o se abrevia como xor
El XOR (xor) es un operador matemático. Se aplica a las operaciones lógicas. El símbolo matemático del XOR es “⊕”, el símbolo de computadora es “xor”. Sus reglas de cálculo son:
a⊕b=(¬a∧b)∨(a∧¬b)
Si los dos valores a y b son diferentes, el resultado del XOR es1。Si los dos valores a y b son iguales, el resultado del XOR es 0.
El XOR también se llama operación de suma semilla, sus reglas de cálculo son equivalentes a la adición binaria sin carry: en el sistema binario se usa1representa verdadero, 0 representa falso, entonces las reglas de cálculo del XOR son: 0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(ambos son 0, diferentes son1), estas reglas son las mismas que las de la adición, solo que sin carry.
El XOR se abrevia como XOR, EOR, EX-OR
En el programa hay tres operadores: XOR, xor, ⊕。
Método de uso:
z=x⊕y
z=xxory
Reglas de operación:
1.a⊕a=0
2.a⊕b=b⊕a
3.a⊕b⊕c=a⊕(b⊕c)=(a⊕b)⊕c;
4.d=a⊕b⊕c se puede deducir que a=d⊕b⊕c.
5.a⊕b⊕a=b.
6.Si x es un número binario 0101,y es un número binario1011
entonces x⊕y=1110
Sólo cuando los bits comparados son diferentes, el resultado es1,de lo contrario, el resultado es 0
Es decir, cuando los dos entradas son iguales, el resultado es 0, diferentes son1”!
Lógica:
Expresión lógica: F=AB'⊕A'B((AB'⊕A'B)'=AB⊙A'B',⊙ es la operación AND)
La tabla de valores verdaderos de la lógica XOR se muestra en la figura1所
Se muestra, el símbolo lógico como se muestra en la figura2Se muestra. La relación lógica del XOR es: cuando AB son diferentes, el resultado es P=1;cuando AB son iguales, el resultado es P=0。“⊕” es el símbolo de operación XOR, la lógica XOR también es una combinación de lógica AND, OR y NOT, su expresión lógica es:
P=A⊕B
Como se muestra en la figura1Por lo tanto, las reglas de la operación XOR son
0⊕0=0,0⊕1=1
1⊕0=1,1⊕1=0
Acrónimo: toma 0 cuando es el mismo, toma 1 cuando es diferente1
De hecho, XOR en inglés se define como eitherone(isone),butnotboth, es decir, solo uno es verdadero (1)。En este caso, toma verdadero (1)。
Función:
Se utiliza ampliamente en computadoras, el símbolo lógico del XOR generalmente se usa como xor, también se usa como ⊕:
Verdadero⊕Falso=verdadero
Falso⊕Verdadero=verdadero
Falso⊕Falso=falso
Verdadero⊕Verdadero=falso
O como:
True⊕False=True
False⊕True=True
False⊕False=False
True⊕True=False
Algunos lenguajes de computación utilizan1Representa verdadero, usa 0 para falso, por lo tanto, dos bytes XOR bit a bit como se muestra a continuación
A continuación, se muestra el cálculo XOR de dos valores binarios:
En la realidad, se utilizan valores decimales, por lo tanto, veamos cómo se realiza el cálculo XOR de dos valores decimales:
5⊕2=?
1.Antes de realizar el cálculo XOR, se convertirán los valores en binario:
5和2Convertir a binario分别为:0101、0010
2.Luego, el resultado 0111.Convertir a decimal:7
3.Por lo tanto5⊕2=7
Truco:
A diferencia de otros lenguajes, el C y el C++En otros lenguajes, el XOR no se usa, sino que se usa “^”, la forma de entrada es Shift+6。(而其它语言的“^”一般表示乘方)
Si se necesita intercambiar los valores de dos variables, además del uso común de una variable intermedia para intercambiar, también se puede utilizar XOR, intercambiando solo con dos variables, por ejemplo:
a=a^b; b=b^a; a=a^b;
Explicación detallada:
a1=a^b b=a1^b a=a1^b=a1^(a1^b)=a1^a1^b=b
Atención:
a=a^b^(b=a);//此类形式是不正确的UB行为,在不同编译器中会有不同的结果,切勿使用
这样就完成了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)); }
注意:以上方法是针对一个十六进制字符串一字节之间的异或运算,如对十五字节的十六进制字符串异或运算:
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[12] = para.substring(24, 26); dateArr[13] = para.substring(26, 28); dateArr[14] = para.substring(28, 30); } catch (Exception e) { // TODO: manejar excepción } 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; }
Llame a esta función en el main o en otro método:
String code = checkcode_0007("1312f70f900168d900007df57b4884});
code es el código de verificación obtenido.
Resumen
Esto es todo el contenido del ejemplo de código de implementación del algoritmo de operación XOR de cadena hexadecimal en Java, espero que sea útil para todos. Los amigos interesados pueden seguir consultando otros temas relacionados en este sitio, y bienvenidos a dejar comentarios si hay algo que no sea adecuado. Agradecemos el apoyo de los amigos a este sitio!
Declaración: El contenido de este artículo se obtiene de la red, y el copyright pertenece al autor. El contenido se contribuye y sube por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha editado人工mente, ni asume la responsabilidad legal correspondiente. Si encuentra contenido sospechoso de copyright, bienvenido a enviar un correo electrónico a: notice#w.3codebox.com (al enviar un correo electrónico, reemplaza # con @ para denunciar, y proporciona pruebas relevantes. Si se encuentra contenido infractor, bienvenido a enviar un correo electrónico a: notice#w.