คำนำ: ฉันไม่ได้เขียนบล็อกเป็นเวลานาน ฉันรู้สึกยุ่งมากในปีที่ผ่านมาและฉันมีงานที่ต้องทำไม่รู้จบ ฉันเชื่อว่าพนักงานสำนักงานหลายคนจะรู้สึกแบบนี้ เมื่อเร็ว ๆ นี้ฉันได้ดำเนินการเขียนการ์ดบน NFC และจำเป็นต้องคำนวณบิตตรวจสอบ โดยทั่วไปแล้วบิตตรวจสอบส่วนใหญ่จะได้รับจากการดำเนินการ XOR ของสองสามไบต์แรก
ตอนนี้ให้ฉันพูดถึงสถานการณ์ที่ฉันใช้:
เขียนข้อมูล 16 ไบต์ลงในการ์ด CPU (เช่นการ์ดจราจร) และไบต์สุดท้ายคือรหัสการตรวจสอบ-สิบห้าไบต์แรก XOR
ฉันเริ่มมองหาอัลกอริทึมบางอย่างที่เขียนโดยคนอื่น ๆ บนอินเทอร์เน็ตและพบว่าผลการคำนวณนั้นผิดหรือการเขียนนั้นซับซ้อนเกินไปดังนั้นฉันจึงเขียนด้วยตัวเองซึ่งรู้สึกว่ามันค่อนข้างง่าย ตอนนี้ฉันจะแบ่งปันกับคุณฉันหวังว่าจะสื่อสารกับคุณด้วยกัน
ส่วนที่ 1: การทำงานของ XOR คืออะไร (ส่วนใหญ่ตัดตอนมาจากสารานุกรม Baidu รองเท้าบูทสำหรับเด็กที่คุ้นเคยสามารถข้ามได้)
คำนิยาม:
Exclusiveor, English เป็น Exclusiveor หรือตัวย่อเป็น XOR
XOR เป็นตัวดำเนินการทางคณิตศาสตร์ มันถูกนำไปใช้กับการดำเนินการเชิงตรรกะ สัญลักษณ์ทางคณิตศาสตร์ของ XOR คือ "" และสัญลักษณ์คอมพิวเตอร์คือ "XOR" อัลกอริทึมคือ:
ab = (¬a∧b) ∨ (a∧¬b)
หากค่า A และ B ไม่เหมือนกันผลลัพธ์ XOR คือ 1 ถ้าค่า A และ B เหมือนกันผลลัพธ์ XOR คือ 0
พิเศษหรือเรียกอีกอย่างว่าการดำเนินการกึ่งเพิ่ม อัลกอริทึมของมันเทียบเท่ากับการเพิ่มไบนารีโดยไม่ต้องพกพา: ในไบนารี 1 ใช้เพื่อเป็นตัวแทนของจริงและ 0 เป็นเท็จจากนั้นอัลกอริทึมของเอกสิทธิ์เฉพาะบุคคลหรือคือ: 00 = 0, 10 = 1, 01 = 1, 11 = 0 (ทั้งคู่เป็น 0, แตกต่างกันคือ 1) กฎหมายเหล่านี้เป็นเช่นเดียวกับนอกจากนี้ แต่ไม่ได้พกพา
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
เฉพาะเมื่อบิตเปรียบเทียบสองบิตแตกต่างกันผลลัพธ์คือ 1 มิฉะนั้นผลลัพธ์คือ 0
นั่นคือ "เมื่ออินพุตสองอินพุตเหมือนกันพวกเขาเป็น 0 และเมื่อพวกเขาแตกต่างกันพวกเขาคือ 1"!
ตรรกะ:
นิพจน์เชิงตรรกะ: f = ab'a'b ((ab'a'b) '= ab⊙a'b', ⊙คือ "เดียวกันหรือ" การดำเนินการ)
ตารางความจริงของ XOR Logic แสดงในรูปที่ 1
สัญลักษณ์เชิงตรรกะแสดงในรูปที่ 2 ความสัมพันธ์ระหว่างลอจิก XOR คือ: เมื่อ AB แตกต่างกันเอาต์พุต p = 1; เมื่อ AB เหมือนกันเอาต์พุต p = 0 "" เป็นสัญลักษณ์การดำเนินการ XOR และ XOR Logic ยังเป็นการรวมกันกับหรือไม่มีเหตุผลและการแสดงออกทางลอจิคัลคือ:
p = ab
จากรูปที่ 1 กฎของการดำเนินการ XOR คือ
00 = 0,01 = 1
10 = 1,11 = 0
สูตรทางจิต: 0 เหมือนกัน 1 เหมือนกัน
ในความเป็นจริง XOR ถูกกำหนดเป็นภาษาอังกฤษเป็นทั้ง (isone) แต่ notboth นั่นคือเมื่อมีเพียงหนึ่งเดียวที่เป็นจริง (1), ใช้จริง (1)
ผล:
มันมักใช้ในคอมพิวเตอร์ สัญลักษณ์เชิงตรรกะของ XOR โดยทั่วไปใช้กับ XOR ซึ่งมีประโยชน์เช่นกัน:
จริงหรือเท็จ = จริง
false true = true
false = false
true = false
หรือ:
TrueFalse = true
falsetrue = true
falseFalse = false
truetrue = false
ภาษาคอมพิวเตอร์บางภาษาใช้ 1 เพื่อเป็นตัวแทนของ TRUE และ 0 เพื่อเป็นเท็จดังนั้นทั้งสองไบต์จึงเป็น bitwise พิเศษหรือดังนี้
ต่อไปนี้เป็นสองค่าไบนารีสำหรับการคำนวณ XOR:
ในความเป็นจริงมีการใช้ค่าทศนิยมดังนั้นลองมาดูกันว่าคำนวณค่าทศนิยมสองค่าสำหรับ XOR ได้อย่างไร:
52 =?
1. ก่อนทำการคำนวณ XOR ค่าทั้งหมดจะถูกแปลงเป็นไบนารี:
5 และ 2 ถูกแปลงเป็นไบนารี: 0101 และ 0010 ตามลำดับ
2. แปลงผลลัพธ์ 0111 เป็นทศนิยม: 7
3. ดังนั้น 52 = 7
การใช้งานที่ชาญฉลาด:
ซึ่งแตกต่างจากภาษาอื่น ๆ XOR ใน C และ C ++ ไม่ได้ใช้ XOR แต่ "^" และวิธีการพิมพ์คือ Shift+6 (และ "^" ในภาษาอื่นโดยทั่วไปหมายถึงทวีคูณ)
หากคุณต้องการแลกเปลี่ยนค่าของตัวแปรสองตัวนอกเหนือจากตัวแปรกลางที่ยืมมาทั่วไปที่ใช้กันทั่วไปสำหรับการแลกเปลี่ยนคุณยังสามารถใช้ XOR และใช้ตัวแปรสองตัวสำหรับการแลกเปลี่ยนเช่น::
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:
สตริงคงที่ส่วนตัว XOR (String strhex_x, String strhex_y) {// แปลง x และ y เป็นรูปแบบไบนารีสตริง otheger notherbinary = integer.tobinaryString (integer.valueof (strhex_x, 16)); String thisbinary = integer.tobinarystring ไบนารีมิฉะนั้นศูนย์ซ้ายจะเสริมถ้า (otentbinary.length ()! = 8) {สำหรับ (int i = otherbinary.length (); i <8; i ++) {otherbinary = "0"+otherbinary;}} ถ้า (thisbinary.length () "0"+thisbinary;}} // การดำเนินการ XOR สำหรับ (int i = 0; i <entoreBinary.length (); i ++) {// ถ้าจำนวนตำแหน่งเดียวกันนั้นเหมือนกันเพิ่ม 0 มิฉะนั้นเพิ่ม 1 ถ้า (thisbinary.charat else {result+= "1";}} log.e ("รหัส", ผลลัพธ์); return integer.tohexstring (integer.parseint (ผลลัพธ์, 2));}หมายเหตุ: วิธีการข้างต้นคือการดำเนินการ XOR ระหว่างหนึ่งไบต์ของสตริง hexadecimal เช่นการดำเนินการ XOR สำหรับสตริง hexadecimal สิบห้าไบต์:
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 = สตริงใหม่ [15]; ลอง {Datearr [0] = para.substring (0, 2); Datearr [1] = para.substring (2, 4); Datearr [2] = para.substring (4, 6); 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); Exception} String code = "" สำหรับ (int i = 0; i <datearr.length-1; i ++) {ถ้า (i == 0) {code = xorstring (datearr [i], datearr [i+1]);จากนั้นเรียกมันว่าในฟังก์ชั่นหลักหรือวิธีอื่น ๆ :
รหัสสตริง = checkCode_0007 ("1312F70F900168D900007DF57B4884");รหัสคือรหัสตรวจสอบที่ได้รับ
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการใช้งานการเขียนโปรแกรม Java ของตัวอย่างรหัสของการดำเนินการพิเศษหรือการดำเนินงานของสตริงเลขฐานสิบหก ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!