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 est abrégé en XOR, EOR, EX-OR
Dans le programme, il y a trois opérateurs : XOR, xor, ⊕.
Méthode d'utilisation :
z=x⊕y
z=xxory
Règles d'opération :
1.a⊕a=0
2.a⊕b=b⊕a
3.a⊕b⊕c=a⊕(b⊕c)=(a⊕b)⊕c;
4.d=a⊕b⊕c peut être déduit a=d⊕b⊕c.
5.a⊕b⊕a=b.
6.Si x est un nombre binaire 0101,y est un nombre binaire1011
alors x⊕y=1110
Le résultat est uniquement différent lorsque les deux bits comparés sont1,sinon le résultat est 0
C'est-à-dire que les deux entrées sont les mêmes, 0, différentes,1”!
Logique :
Expression logique : F=AB'⊕A'B((AB'⊕A'B)'=AB⊙A'B',⊙ est l'opération “et”)
La table de vérité de la logique xor est comme le graphique1所示
Montrer, son symbole logique comme le graphique2Montrer. La relation logique de xor est : lorsque AB sont différents, la sortie P=1;Lorsque AB sont identiques, la sortie P=0.“⊕” est le symbole d'opération xor, et la logique xor est également une combinaison de logique ET, OU, NON, son expression logique est :
P=A⊕B
À partir du graphique1Il est donc possible de voir que les règles de l'opération xor sont
0⊕0=0,0⊕1=1
1⊕0=1,1⊕1=0
Règle : Les mêmes prennent 0, les différents prennent1
En fait, la définition de XOR en anglais est eitherone(isone),butnotboth, c'est-à-dire qu'il n'y a qu'un seul qui est vrai (1)。Au moment où, choisissez la vérité (1)。
Fonction :
Il est largement utilisé dans les ordinateurs, le symbole logique xor est généralement utilisé xor, mais aussi ⊕ :
Vérité⊕Fausse=True
Fausse⊕Vérité=True
Fausse⊕Fausse=Faussé
Vérité⊕Vérité=Faussé
ou :
True⊕False=True
False⊕True=True
False⊕False=False
True⊕True=False
Certains langages informatiques utilisent1Représente la vérité, avec 0 pour la fausseté, donc deux octets xor bit par bit comme suit
Voici le calcul xor de deux nombres binaires :
Dans la vie réelle, on utilise tous des nombres décimaux, alors regardons comment deux nombres décimaux font le calcul xor :
5⊕2=?
1.Avant de faire le calcul xor, convertissez les valeurs en binaire :
5et2est converti en binaire respectivement : 0101、0010
2.Ensuite, le résultat 0111.Conversion en décimal :7
3.Ainsi5⊕2=7
Astuce :
Différent des autres langages, le C et le C++Les opérateurs xor d'autres langages ne sont pas utilisés, mais “^”, la méthode de saisie est Shift+6。(dans d'autres langages, le “^” généralement représente la puissance)
Si vous souhaitez échanger les valeurs de deux variables, en plus de l'utilisation habituelle d'un variable intermédiaire pour l'échange, vous pouvez également utiliser l'xor, en utilisant uniquement deux variables pour l'échange, par exemple :
a=a^b; b=b^a; a=a^b;
Explication :
a1=a^b b=a1^b a=a1^b=a1^(a1^b)=a1^a1^b=b
Attention :
a = a ^ b ^ (b = a);//Ce type de forme est une mauvaise conduite UB, ayant des résultats différents sur différents compilateurs, ne pas utiliser
De cette manière, l'échange de a et b est terminé.
En conséquence : La xor entre une variable et la xor de cette variable avec une autre variable est égale à elle-même.
Exemple d'utilisation : Peut être utilisé dans une étape ou plusieurs étapes d'un algorithme de cryptage, rendant l'algorithme plus complexe, plus difficile à破解, et plus sûr. [1]
Deuxième section : Implémentation en langage Java :
private static String xor(String strHex_X, String strHex_Y){ //Convertir x, y en forme binaire String anotherBinary = Integer.toBinaryString(Integer.valueOf(strHex_X,16)); String thisBinary = Integer.toBinaryString(Integer.valueOf(strHex_Y,16)); String result = ""; //Judgment whether it is8binaire, sinon, remplacez par des zéros à gauche 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; } } //Opération xor for (int i = 0; i < anotherBinary.length(); i++{ //Si les nombres à la même position sont identiques, ajoutez des zéros, sinon, remplacez par1 if(thisBinary.charAt(i) == anotherBinary.charAt(i)) result+="0"; else{ result+="1"; } } Log.e("code",result); return Integer.toHexString(Integer.parseInt(result, 2)); }
Attention : La méthode ci-dessus s'applique à l'opération exclusive ou (xor) d'un octet entre des chaînes hexadécimales, par exemple, pour une chaîne hexadécimale de 15 octets :
1312f70f900168d900007df57b4884
Faisons d'abord une séparation :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
C'est-à-dire, le code de vérification d'un octet obtenu est : e6
Complément, une méthode d'appel simple a été ajoutée pour quelques amis à titre d'exemple :
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: gérer l'exception } 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; }
Ensuite, appeler dans la fonction principale ou dans d'autres méthodes :
String code = checkcode_0007("1312f70f900168d900007df57b4884");
code est le code de vérification obtenu.
Résumé
Voici tous les exemples de code de la programmation Java pour l'opération de XOR sur les chaînes hexadécimales, j'espère que cela vous sera utile. Les amis intéressés peuvent continuer à consulter d'autres sujets pertinents sur ce site. Si vous trouvez des insuffisances, n'hésitez pas à laisser un message. Merci de votre soutien à ce site !
Déclaration : Le contenu de cet article est issu du réseau, propriété des auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet. Ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)