[轉載] 用Java語言實現對十六進制字符串異或運算

參考鏈接: 交換兩個字符串,而無需在Java中使用第三個用戶定義的變量

前言:好久沒有寫博客,最近一年感覺真是好忙,各種做不完的工作。相信很多上班族都會有這種感覺。最近對NFC進行寫卡操作,需要計算一個校驗位。一般情況下,校驗位多數是由前幾個字節進行異或運算所得。?

??

現在我就先說一下我使用的場景:?

把一個16字節的數據寫到CPU卡(如交通卡)里面,最后一字節是校驗碼---前十五字節異或。?

我開始從網上找了一些別人寫的算法發現計算后結果不對,或者就是寫的太復雜了,于是自己就寫了一個,感覺也比較簡單,現在分享給大家,希望一起交流一下。?

第一節:什么是異或運算(主要摘自百度百科,熟悉的童靴可以跳過)?

定義:?

?

?

?異或,英文為exclusive OR,或縮寫成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、EOR、EX-OR

?

?

?程序中有三種演算子:XOR、xor、⊕。

?

?

?使用方法如下

?

?

?z = x ⊕ y

?

?

?z = x xor y

?

運算規則:?

?

?

?

?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’,⊙為“同或”運算)

?

?

?異或邏輯的真值表如圖1所

?

?

? 示,其邏輯符號如圖2所示。異或邏輯的關系是:當AB不同時,輸出P=1;當AB相同時,輸出P=0。“⊕”是異或運算符號,異或邏輯也是與或非邏輯的組合,其邏輯表達式為:

?

?

?P=A⊕B

?

?

?由圖1可知,異或運算的規則是

?

?

?0⊕0=0,0⊕1=1

?

?

?1⊕0=1,1⊕1=0

?

?

?口訣:相同取0,相異取1

??

?

?

?事實上,XOR 在英文里面的定義為either one (is one), but not both, 也即只有一個為真(1)時,取真(1)。

?

作用:?

?

?

?

?在計算機中普遍運用,異或(xor)的邏輯符號一般用xor,也有用⊕的:

?

?

?真⊕假=真

?

?

?假⊕真=真

?

?

?假⊕假=假

?

?

?真⊕真=假

?

?

?或者為:

?

?

?True ⊕ False = True

?

?

?False ⊕ True = True

?

?

?False ⊕ False = False

?

?

?True ⊕ True = False

?

?

?部分計算機語言用1表示真,用0表示假,所以兩個字節按位異或如下

?

? ?

? ??

? ? ?00000000

? ? ??

? ??

? ? ?xor

? ? ??

? ??

? ? ?00000000

? ? ??

? ??

? ? ?----------------------------------

? ? ? ??

? ??

? ? ?00000000

? ? ??

?

?============我是分界線1============

?

?

?下面是兩個二進制數值進行異或計算:

?

? ?

? ??

? ? ?11111111

? ? ??

? ??

? ? ?xor

? ? ??

? ??

? ? ?00000000

? ? ??

? ??

? ? ?----------------------------

? ? ? ??

? ??

? ? ?11111111

? ? ??

?

?============我是分界線2============

?

?

?現實中用的都是十進制的數值,那么我們來看一看兩個十進制數值是怎么進行異或計算:

?

?

?5 ⊕ 2 = ?

?

?

?1.進行異或計算前會把數值都轉換為二進制的:

?

?

?5和2轉為二進制分別為:0101 、0010

?

? ?

? ??

? ? ?0101

? ? ??

? ??

? ? ?xor

? ? ??

? ??

? ? ?0010

? ? ??

? ??

? ? ?----------------------------

? ? ? ??

? ??

? ? ?0111

? ? ??

?

?2.再把結果 0111 轉換為十進制的:7

?

?

?3.所以 5 ⊕ 2 = 7

?

巧用:?

?

?

?

?與其它語言不同,C語言和C++語言的異或不用xor,而是用“^”,鍵入方式為Shift+6。(而其它語言的“^”一般表示乘方)

?

?

?若需要交換兩個變量的值,除了通常使用的借用中間變量進行交換外,還可以利用異或,僅使用兩個變量進行交換,如:

?

?

??

? ?

? ? ? ?

? ? ? ?1

? ? ? ?

? ? ? ?

? ? ? ?2

? ? ? ?

? ? ? ?

? ? ? ?3

? ? ? ??

? ? ? ?

? ? ? ??

? ? ? ? a=a^b;

? ? ? ??

? ? ? ??

? ? ? ? b=b^a;

? ? ? ??

? ? ? ??

? ? ? ? a=a^b;

? ? ? ??

? ? ? ??

??

?

?

?詳解:

?

?

??

? ?

? ? ? ?

? ? ? ?1

? ? ? ?

? ? ? ?

? ? ? ?2

? ? ? ?

? ? ? ?

? ? ? ?3

? ? ? ??

? ? ? ?

? ? ? ??

? ? ? ? a1=a^b

? ? ? ??

? ? ? ??

? ? ? ? b=a1^b

? ? ? ??

? ? ? ??

? ? ? ? a=a1^b=a1^(a1^b)=a1^a1^b=b

? ? ? ??

? ? ? ??

??

?

?

?注意:

?

?

??

? ?

? ? ? ?

? ? ? ?1

? ? ? ??

? ? ? ?

? ? ? ??

? ? ? ? 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: handle 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;

}然后再主函數或者其他方法里面調用:?

?

?

String code = checkcode_0007("1312f70f900168d900007df57b4884");code就是獲取的校驗碼了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540209.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540209.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL日常應用操作記錄

1.知道一個字段名&#xff0c;怎樣查到它在數據庫里的哪張表里&#xff1f; USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE COLUMN_NAME字段名稱; MySQL中查看庫表字段信息都在information_schemal中&#xff0c;獲取數據字典等信息都要通過這個視圖。 如&…

[轉載] 【Java】將一個字符串的字符排序,按ASCII表的順序從小到大

參考鏈接&#xff1a; 在Java中搜索字符串中的字符和子字符串 將一個字符串的字符按ASCII表的順序從小到大排序&#xff0c;如將字符串“asdafxcvMADb”排序為“ADMaabcdfsvx” 算法的基本思想&#xff1a; 先將字符串轉化為一個char類型的數組&#xff0c;來進行存儲&#xf…

如果只做前端驗證的話,談jjdd.com的看照片功能。

如果你在上海&#xff0c;并且坐過地鐵的話&#xff0c;你肯定知道jjdd.com。 這個網站和百合&#xff0c;世紀佳緣類似&#xff0c;都是交朋友的性質。 在jjdd.com中有個很重要的功能&#xff1a;如果你上傳的照片比你想看的人少的話&#xff0c;你是不能看她的照片的。 例如如…

[轉載] 快速學習-Mybatis框架概述

參考鏈接&#xff1a; Java在競爭性編程中的快速I/O 第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架&#xff08;Framework&#xff09;是整個或部分系統的可重用設計&#xff0c;表現為一組抽象構件及構件實例間交互的方法;另一種定義認為&#xff0c;框架是可被…

3、MySQL的數據類型介紹

上一章節內容主要介紹了一些MySQL中對表和庫的增刪改查操作&#xff0c;對于上一章中對與表中字段的一些定義進行說明&#xff0c;本章主要介紹關于數據庫類型的一些定義。一、概述&#xff1a;MySQL數據庫中的數據大致可以分為以下幾類&#xff0c;從而實現數據庫在操作的時候…

[轉載] 必須要會回答的Java面試題(字符串篇)

參考鏈接&#xff1a; 比較Java中的兩個字符串String 最近很多學習java的小白問我字串相關的問題&#xff0c;覺得很有必要整理下&#xff0c;以方便初學者理解字符串以及應對今后面試中考官的提問。 如果你是有幾年Java開發經驗&#xff0c;可以根據目錄選擇性的閱讀以下內…

[轉載] java如何實現一個字符串的反轉和替換

參考鏈接&#xff1a; 反轉Java中的字符串String 一、java字符串的反轉 1.利用java字符串的拼接實現字符串的反轉&#xff0c;代碼如下&#xff1a; public static String reverse(String s){ int lens.length(); String str""; for (int i 0; i < len; i) { …

java 中的instanceof

java 中的instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出&#xff0c;這個對象是否是這個特定類或者是它的子類的一個實例。 用法&#xff1a;result object instanceof class參數&#xff1a;Result&#xff1a;布爾類…

[轉載] 將一個整數型字符串轉換為一個整數

參考鏈接&#xff1a; Java中整數到字符串轉換的不同方法 package com.utl.string; /* * 將一組整數字符串轉換為整數 * 例&#xff1a;"234"轉換為整數型234 * 分析&#xff1a;涉及到許多問題&#xff0c;例如非法輸入&#xff0c;有正負號&#xff0c;是否為空字…

升級PowerShell至4.0版本

為了更好的使用Cmder v1.2&#xff0c;不得不升級PowerShell為4.0。 不知道Cmder的&#xff0c;可以點擊這里&#xff1a;https://github.com/cmderdev/cmder 和 逆天神器 cmder。 Powershell是運行在Windows機器上實現系統和應用程序管理自動化的命令行腳本環境。 需要.NET環境…

[轉載] 字符串太長 pep8_Python f字符串– PEP 498 –文字字符串插值

參考鏈接&#xff1a; 從Java中的字符串中刪除前導零 字符串太長 pep8 Python f-strings or formatted strings are the new way to format strings. This feature was introduced in Python 3.6 under PEP-498. It’s also called literal string interpolation. Python f字符…

備忘(持續更新。。。)

1、在springmvc這個框架里面&#xff0c;創建新的業務邏輯層&#xff0c;dao、service層至少需要一個接口&#xff0c;項目才能跑起來 2、獲取當前用戶桌面路徑 File desktopDir FileSystemView.getFileSystemView() .getHomeDirectory();String desktopPath desktopDir.getA…

[轉載] 字符串操作截取后面的字符串_對字符串的5個必知的熊貓操作

參考鏈接&#xff1a; 修剪Java中的字符串(刪除前導和尾隨空格) 字符串操作截取后面的字符串 We have to represent every bit of data in numerical values to be processed and analyzed by machine learning and deep learning models. However, strings do not usually co…

更改域控制器的計算機名

林功能級別必須為Windows Server 2003及以上 1. netdom computername Server08-1.contoso.com /add:08Server1.contoso.com 2. netdom computername Server08-1.contoso.com /makeprimary:08Server1.contoso.com 3. Restart your computer 4. netdom computername 08Server1.co…

[轉載] Google Java代碼規范

參考鏈接&#xff1a; 使用Java計算文本文件txt中的行數/單詞數/字符數和段落數 原文地址&#xff1a;https://google.github.io/styleguide/javaguide.html GIthub上GoogleCode風格的配置文件&#xff08;支持Eclipse IDE和IntelliJ IDE&#xff09;&#xff1a;https://git…

SQL PASS西雅圖之行——簽證篇

本人有幸通過IT168&itpub的站慶活動http://www.itpub.net/thread-1716961-1-1.html&#xff0c;并應微軟邀請參加了在西雅圖舉辦的The Conference for SQL Server Professionals&#xff08;簡稱SQL-PASS&#xff09;。 SQL-PASS會議計劃于2012年11月6日-9日舉行&#xff0…

[轉載] java8 lambda表達式 List轉為Map

參考鏈接&#xff1a; 使用Lambda表達式檢查字符串在Java中是否僅包含字母 public static void main(String[] args) { List<User> userList new ArrayList<User>(); User user0 new User("han1", "男1", 20); User user1 new User("…

11.python并發入門(part5 event對象)

一、引入event。 每個線程&#xff0c;都是一個獨立運行的個體&#xff0c;并且每個線程的運行狀態是無法預測的。 如果一個程序中有很多個線程&#xff0c;程序的其他線程需要判斷某個線程的運行狀態&#xff0c;來確定自己下一步要執行哪些操作。 threading模塊中的event對象…

[轉載] Java 將字符串首字母轉為大寫 - 利用ASCII碼偏移

參考鏈接&#xff1a; 使用ASCII值檢查Java中的字符串是否僅包含字母 將字符串name 轉化為首字母大寫。普遍的做法是用subString()取第一個字母轉成大寫再與之后的拼接&#xff1a; str str.substring(0, 1).toUpperCase() str.substring(1); 看到一種效率更高的做法&…

俞永福卸任阿里大文娛董事長,改任 eWTP 投資組長

兩天前&#xff08;11月13日&#xff09;&#xff0c;阿里文娛董事長俞永福離職的消息&#xff0c;在互聯網圈炸了鍋。但很快&#xff0c;俞本人就在微博做了澄清&#xff0c;并稱“永遠幸福&#xff0c;我不會離開”。然而就在今天&#xff08;11月15日&#xff09;&#xff0…