序文:私は長い間ブログを書いていません。過去1年間はとても忙しく、無限の仕事があります。多くのオフィスワーカーがこのように感じると思います。最近、私はNFCでカードライティング操作を実行し、チェックビットを計算する必要があります。一般的に、ほとんどのチェックビットは、最初の数バイトのXOR操作によって取得されます。
さて、私が使用するシナリオについて話させてください:
16バイトのデータをCPUカード(トラフィックカードなど)に記述すると、最後のバイトは検証コードであり、最初の15バイトXORです。
私はインターネット上で他の人によって書かれたいくつかのアルゴリズムを探し始めましたが、計算結果が間違っているか、文章が複雑すぎることを発見したので、自分で書いたので、比較的簡単だと感じました。今、私はあなたとそれを共有します、私はあなたと一緒にコミュニケーションをとることを望んでいます。
セクション1:XOR操作とは(主にBaidu Encyclopediaから抜粋し、おなじみの子供用ブーツをスキップできます)
意味:
独占者、英語は排他的であるか、XORと略されています
Xorは数学演算子です。論理操作に適用されます。 XORの数学的記号は「」であり、コンピューターシンボルは「XOR」です。アルゴリズムは次のとおりです。
ab =(¬a∧b)∨(a∧¬b)
値aとbが同じでない場合、xorの結果は1です。値aとbが同じ場合、xorの結果は0です。
排他的であるか、セミアドディッショナル操作とも呼ばれます。そのアルゴリズムは、キャリーなしのバイナリ加算と同等です。バイナリでは、1はtrueを表すために使用され、0はfalse、または排他的またはIS:00 = 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.ABA = b。
6. xがバイナリ番号0101の場合、yはバイナリ番号1011です
その後、xy = 1110
2つの比較ビットが異なる場合にのみ、結果は1です。そうしないと、結果は0です
つまり、「2つの入力が同じ場合、それらは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は英語で(イソオン)として定義されますが、一体ではなく、1つだけが真(1)である場合、真(1)を取得します。
効果:
コンピューターで一般的に使用されます。 XORの論理シンボルは一般にXORで使用されますが、これも便利です。
trueまたはfalse = true
false true = true
false = false
true = false
または:
truefalse = true
falsetrue = true
falsefalse = false
truetrue = false
一部のコンピューター言語は、1を使用してtrueを表し、0をfalseを表すために0を使用しているため、2つのバイトはビットごとに排他的であるか、次のとおりです。
以下は、XOR計算の2つのバイナリ値です。
実際には、小数値が使用されているため、XORについて2つの小数値がどのように計算されるかを見てみましょう。
52 =?
1. XOR計算を実行する前に、すべての値がバイナリに変換されます。
5と2はそれぞれバイナリ:0101と0010に変換されます
2。結果0111を小数点に変換します:7
3。したがって、52 = 7
巧妙な使用:
他の言語とは異なり、CおよびC ++のXORはXORではなく「^」を使用しません、そして、タイピング方法はShift+6です。 (そして、他の言語の「^」は一般的に増殖することを意味します)
2つの変数の値を交換する必要がある場合、一般的に使用される借用された中間変数に交換に加えて、XORを使用して、次のような交換に2つの変数のみを使用することもできます。
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をバイナリフォームに変換するstring asoneminary.tobinarystring(integer.valueof(strhex_x、16)); string thibinary = integer.tobinarystring(integer.valueof(sr strhex_y restine);バイナリ、それ以外の場合は、左ゼロが補足されます(anotherbinary.length()!= 8){for(int i = anotherbinary.length(); i <8; i ++){anotherbinary = "0"+asoutherbinary;}} if(thisbinary.length()!= 8){for i = thisbinary.length( "0"+thisbinary;}} // XOR操作(int i = 0; i <anotherbinary.length(); i ++){//同じ位置の数が同じ場合、0を追加します。 else {result+= "1";}} log.e( "code"、result); return integer.tohexstring(integer.parseint(result、2));}注:上記の方法は、15バイバートの16進数文字列のXOR操作など、1ヘクサデシマル文字列の1つのバイト間のXOR操作です。
1312F70F900168D900007DF57B4884
最初に分割:13 12 F7 0F 90 01 68 D9 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 [3]; datearr [3]; 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); 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] = par.substring(28、30);例外}文字列code = ""; for(int i = 0; i <datearr.length-1; i ++){if(i == 0){code = xorstring(datearr [i]、datearr [i+1]);}次に、メイン関数またはその他の方法でそれを呼び出します。
文字列code = checkcode_0007( "1312f70f900168d900007df57b4884");
コードは取得したチェックコードです。
要約します
上記は、Javaプログラミングに関するこの記事の全体的な内容です。これは、16進文字列の排他的または操作のコード例の実装です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!