English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
前言:好久没有写博客,最近一年感觉真是好忙,各种做不完的工作。相信很多上班族都会有这种感觉。最近对NFC进行写卡操作,需要计算一个校验位。一般情况下,校验位多数是由前几个字节进行异或运算所得。
现在我就先说一下我使用的场景:
把一个16字节的数据写到CPU卡(如交通卡)里面,最后一字节是校验码---前十五字节异或。
我开始从网上找了一些别人写的算法发现计算后结果不对,或者就是写的太复杂了,于是自己就写了一个,感觉也比较简单,现在分享给大家,希望一起交流一下。
第一节:什么是异或运算(主要摘自百度百科,熟悉的童靴可以跳过)
定义:
异或,英文为exclusiveOR,或缩写成xor
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b=(¬a∧b)∨(a∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。
XOR wird kurz als XOR, EOR oder EX bezeichnet-ODER
Im Programm gibt es drei Operatoren: XOR、xor、⊕.
Verwendung wie folgt
z=x⊕y
z=xxory
Berechnungsregeln:
1.a⊕a=0
2.a⊕b=b⊕a
3.a⊕b⊕c=a⊕(b⊕c)=(a⊕b)⊕c;
4.d=a⊕b⊕c kann abgeleitet werden a=d⊕b⊕c.
5.a⊕b⊕a=b.
6.Wenn x eine binäre Zahl 0 ist101,y ist eine binäre Zahl1011
dann x⊕y=1110
Der Ausgang ist nur dann, wenn die beiden verglichenen Bits unterschiedlich sind1sonst ist der Ausgang 0
Das bedeutet, dass der Ausgang 0 ist, wenn die beiden Eingaben gleich sind, und1”!
Logik:
Logische Ausdrucksform: F=AB'⊕A'B((AB'⊕A'B)'=AB⊙A'B',⊙ ist die ‘oder gleicher als’-Operation)
Die Wahrheitsfunktionstabelle der XOR-Logik ist wie in der Abbildung1dargestellt
Dargestellt, das Symbol der Logik wie in der Abbildung2Dargestellt. Die Beziehung der XOR-Logik ist: Wenn AB unterschiedlich sind, wird ausgegeben P=1;Wenn AB gleich sind, wird ausgegeben P=0.“⊕” ist das Symbol der XOR-Operation, die XOR-Logik ist auch eine Kombination der und/or/not-Logik, die logische Ausdrucksform ist:
P=A⊕B
Wie gezeigt1Kann also die Regeln der XOR-Operation sein
0⊕0=0,0⊕1=1
1⊕0=1,1⊕1=0
Sprichwort: Gleichheit ergibt 0, Unterschied ergibt1
In der Tat ist die Definition von XOR im Englischen eitherone(isone),butnotboth, das heißt, nur einer ist wahr(1)wird wahr genommen(1)。
Wirkung:
Wird im Computer weit verbreitet verwendet, der logische Symbol des XOR ist normalerweise xor, aber auch ⊕:
Wahr⊕Falsch=Wahr
Falsch⊕Wahr=Wahr
Falsch⊕Falsch=Falsch
Wahr⊕Wahr=Falsch
oder:
True⊕False=True
False⊕True=True
False⊕False=False
True⊕True=False
Einige Computersprachen verwenden1Stellt wahr dar, mit 0 falsch, daher wird der Bitwise XOR der beiden Bytes wie folgt berechnet
Hier ist die XOR-Berechnung zweier binärer Werte:
In der Realität werden alle Dezimalzahlen verwendet, also schauen wir uns an, wie zwei Dezimalzahlen berechnet werden:
5⊕2=?
1.Bevor die Werte in die binäre Darstellung umgewandelt werden, werden die Werte in die binäre Darstellung umgewandelt:
5und2in Binär umgewandelt, wobei 0101、0010
2.Dann wird das Ergebnis 0111.Wandeln Sie in den Dezimalwert um:7
3.Daher5⊕2=7
Taktvoll verwenden:
Anders als in anderen Sprachen, C und C++Der XOR in anderen Sprachen wird nicht mit xor, sondern mit “^” verwendet, die Tastaturbelegung ist Shift+6。(而在其他语言的“^”通常表示乘方)
Wenn Sie den Wert zweier Variablen tauschen möchten, können Sie neben dem gewöhnlichen Tausch mit einem Zwischenvariable auch den XOR verwenden, um mit nur zwei Variablen zu tauschen, z.B.:
a=a^b; b=b^a; a=a^b;
Erklärung:
a1=a^b b=a1^b a=a1^b=a1^(a1^b)=a1^a1^b=b
Hinweis:
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: Exception behandeln } 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; }
Außerdem können Sie ihn im Hauptprogramm oder anderen Methoden aufrufen:
String code = checkcode_0007(")1312f70f900168d900007df57b4884");
Der code ist der erhaltene Prüfcode.
Zusammenfassung
Dies ist der vollständige Inhalt der Beispielcode-Implementierung von XOR-Operationen auf Hexadezimalstrings in Java-Programmierung. Hoffentlich ist es für alle nützlich. Interessierte Freunde können andere verwandte Themen auf dieser Website weiter lesen. Wenn es Mängel gibt, freuen wir uns über Kommentare. Vielen Dank für die Unterstützung der Freunde dieser Website!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern freiwillig und selbstständig hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine Meldung senden, und fügen Sie relevante Beweise bei. Sobald überprüft, wird die Website die fraglichen urheberrechtlichen Inhalte sofort löschen.)