English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
مقدمة: لم أكتب في المدونة منذ فترة طويلة، شعرت أن السنة الماضية كانت مشغولة جدًا، مع الكثير من العمل الذي لا ينتهي. أعتقد أن العديد من العمال اليوميين يشعرون بنفس الشعور. مؤخراً، قمت بكتابة بطاقات NFC وكنت بحاجة إلى حساب مكان التحقق. عادةً، يتم حساب مكان التحقق من خلال حساب الإشارة للبعض من البتات الأولى
سأبدأ أولاً بالتحدث عن السيناريو الذي أستخدمه:
كتابة بيانات 16 بت على بطاقة المعالجة (مثل بطاقات النقل) ويكون البت الأخير هو الرقم التحققي - البت ال15 هو حساب الإشارة
بدأت أبحث عبر الإنترنت عن بعض الألغام التي كتبها الآخرون، ووجدت أن النتائج غير صحيحة، أو أن الكتابة معقدة جدًا، لذا كتبت واحدة بنفسي، وأشعر بأنها بسيطة، وأشاركها الآن، آمل في تبادل الأفكار
الجزء الأول: ما هو حساب الإشارة (أخذ من ويكيبيديا، يمكن للطلاب المألوفين السكوت عنه)
تعريف:
الإشارة أو، بالإنجليزية exclusive OR، أو اختصاراً xor
XOR هو علامة حسابية رياضية. يتم استخدامه في العمليات المنطقية. علامة الحساب الرياضية لXOR هي "⊕"، وعلامة الحساب الحاسوبي هي "xor". قواعد الحساب هي:
a⊕b=(¬a∧b)∨(a∧¬b)
إذا كانت القيم a وb مختلفة، فإن نتيجة XOR هي 1. إذا كانت القيم a وb متطابقة، فإن نتيجة XOR هي 0.
XOR يُدعى أيضًا عملية إضافة نصفية، وقواعد حسابها تشبه حساب الإضافة الثنائية بدون ناقص، حيث يتم استخدام 1 لتمثيل الصحة، و0 لتمثيل الخطأ، فإن قواعد XOR هي: 0⊕0=0، 1⊕0=1، 0⊕1=1، 1⊕1=0 (النفسية تأخذ 0، والمختلفة تأخذ 1)، هذه القواعد تشبه قواعد الإضافة، ولكن بدون ناقص
XOR يُقصر على XOR، EOR، EX-OR
هناك ثلاثة علامات حسابية في البرنامج: XOR، xor، ⊕.
استخدام الطريقة التالية
z=x⊕y
z=xxory
قواعد العملية:
1. a⊕a=0
2. a⊕b=b⊕a
3. a⊕b⊕c=a⊕(b⊕c)=(a⊕b)⊕c;
4. d=a⊕b⊕c يمكن استنتاج a=d⊕b⊕c.
5. a⊕b⊕a=b.
6. إذا كان x هو الرقم الثنائي 0101، فإن y هو الرقم الثنائي 1011
ثم x⊕y=1110
يتم الحصول على النتيجة 1 فقط عندما تكون المواضع الم مقارنة مختلفة، وإلا يتم الحصول على النتيجة 0
بمعنى "إذا كانت المدخلات متطابقة، فإن النتيجة هي 0، وإذا كانت مختلفة، فإن النتيجة هي 1"!
منطق:
تعبير منطقي: F=AB'⊕A'B((AB'⊕A'B)'=AB⊙A'B'،⊙ هو عملية AND)
جدول الحقائق لمنطق XOR كما في الرسم البياني 1:
يظهر، علامة منطقية كما في الشكل 2. علاقة XOR المنطقية هي: عندما يكون AB مختلفين، يتم إصدار P=1؛ عندما يكون AB متطابقين، يتم إصدار P=0. "⊕" هو علامة عملية XOR، منطق XOR هو أيضًا مجموعة من منطق OR وNOT، ويمكن كتابة تعبير منطقي لها كالتالي:
P=A⊕B
من الرسم البياني 1 يمكن رؤية قواعد عملية XOR:
0⊕0=0,0⊕1=1
1⊕0=1,1⊕1=0
القاعدة: نفس القيمة تأخذ 0، والمختلفة تأخذ 1
في الواقع، يتم تعريف XOR في الإنجليزية بأنه eitherone(isone),butnotboth، أي عند وجود واحد فقط كصحيح (1)، يتم أخذ الصحيح (1).
الوظيفة:
يستخدم في الحواسيب بشكل واسع، علامة XOR المنطقية عادة ما تستخدم xor، أو يمكن استخدام ⊕:
الصحة⊕الخطأ=الصحة
الخطأ⊕الصحة=الصحة
الخطأ⊕الخطأ=الخطأ
الصحة⊕الصحة=الخطأ
أو يمكن كتابته:
True⊕False=True
False⊕True=True
False⊕False=False
True⊕True=False
بعض لغات البرمجة تستخدم 1 لتمثيل الصحة، وتستخدم 0 لتمثيل الخطأ، لذا يتم XOR للبتيتين على المستوى المناسب كما يلي
إليك كيف يتم إجراء حساب XOR بين قيمين ثنائيين:
في الواقع، يستخدم العدد العشري في الحسابات، لنرى كيف يتم إجراء حساب XOR بين قيمين عشريين:
5⊕2=؟
1. قبل إجراء حساب التباين، يتم تحويل القيم إلى ثنائي:
5 و 2 يتحولان إلى ثنائي على التوالي: 0101 و 0010
2. الآن قم بتحويل النتيجة 0111 إلى عشري: 7
3. لذا 5⊕2=7
الاستخدام الذكي:
مختلف عن اللغات الأخرى، لا تستخدم C و C++ التباين مع xor، بل مع "^"، ويتم إدخالها باستخدام Shift+6. (بينما يمثل "^" في اللغات الأخرى عادةً رفع القوة)
إذا كنت بحاجة إلى تبادل قيم متغيرين، بالإضافة إلى استخدام متغير وسطي للتبادل، يمكنك أيضًا استخدام التباين، فقط باستخدام متغيرين، مثل:
a=a^b; b=b^a; a=a^b;
التوضيح:
a1=a^b b=a1^b a=a1^b=a1^(a1^b)=a1^a1^b=b
التحذير:
النقطة: 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 bits، وإلا يتم إكماله بالصفر إذا (anotherBinary.length() != 8) { للدوران (int i = anotherBinary.length(); i <8; i++) { anotherBinary = "0"+anotherBinary; } } إذا (thisBinary.length() != 8) { للدوران (int i = thisBinary.length(); i <8; i++) { thisBinary = "0"+thisBinary; } } // عمليات التباين للدوران (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: handle exception } String code = ""; للدوران في dateArr.length-1; i++) { if(i == 0){ code = xorString(dateArr[i], dateArr[i+1]); } code = xorString(code, dateArr[i]); } } return code; }
ثم استدعاء هذا في الدالة الرئيسية أو أي دالة أخرى:
String code = checkcode_0007("1312f70f900168d900007df57b4884");
code هي الرمز التحقق الذي تم الحصول عليه.
الإجمال
هذا هو محتوى المقال الكامل حول مثال على تنفيذ عملية التمييز bitwise لـ Java لـ strings السداسية عشر، آمل أن يكون مفيدًا لكم. يمكن للذين يهتمون بالمتابعة مراجعة مواضيع أخرى مرتبطة بالموقع، وترحيبًا بأي ملاحظات حول نقاط الضعف، شكرًا للدعم الذي يقدمونه للموقع!
البيان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المحتوى تخص صاحب الحقوق، المحتوى تم إضافته من قبل مستخدمي الإنترنت بذاتهم، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فيرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' ب '@') لإبلاغنا، وقدم الأدلة ذات الصلة، وسيتم حذف المحتوى المشبوه فور التحقق منه.