<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近有個傳送簡訊的功能,需要在簡訊中帶有詳情連結,連結中帶有對應資訊且要有校驗功能,然而簡訊是按字數收費的,所以連結要儘可能的短。連結中帶有數位型別引數,就想到通過低進位制轉高進位制可以減少引數長度。
低進位制轉換到高進位制的時候可能會減少位數,例如二進位制是滿二進一,十進位制是滿十進一。
二進位制:101001101
我們平常用的都是十進位制的數值,就以十進位制來講解下轉換方法。
1、A除以N,商數為S1,餘數為Y1;
2、將S1除以N,商數為S2,餘數為Y2;
3、將S2除以N,商數為S3,餘數為Y3;
4、迴圈n次直到商數為0,餘數為Yn(Yn < N,n為下標,代表迴圈次數);
5、將餘數Yn作為下標取到對應的N進位制的值Rn;
6、Rn,Rn-1,...,R2,R1拼接起來就得到N進位制數R
用以上方法,如果是轉換為十六進位制,我們帶入看下結果
十六進位制值為0123456789ABCDEFA = 812, N = 16
1、812除以16,商數為50,餘數為12(對應十六進位制數:C);
2、將50除以16,商數為3,餘數為2(對應十六進位制數:2);
3、將3除以16,商數為0,餘數為3(對應十六進位制數:3);
4、所以R = 32C
假設R有三位數 R2R1R0,從右到左開始處理資料
S0=R0∗N0
S1=R1∗N1
S2=R2∗N2
A=S0+S1+S2
帶入實際數位實踐一下十六進位制8F1轉換過程
S0=1∗160 = 1 * 1 = 1
S1=F∗161 = F + 16 = 15 * 16 = 240
S2=8∗162 = 8 * 256 = 2048
A=1+240+2048=2289
前面以十進位制和十六進位制轉換舉例是為了更好幫助大家理解轉換的方式,在應用的過程中我們會發現十進位制轉十六進位制並不能減少很多數位的位數,那麼我們就可以使用三十二進位制,甚至是六十二進位制。
六十二進位制轉換工具類實現:
/** * 支援 import Java 標準庫 (JDK 1.8) */ import java.util.*; /** * 六十二進位制轉換工具類 */ public class Main { // 將字元集打亂就會帶有一點加密效果 private static final String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final int scale = 62; public static void main(String []args) { Long source1 = 121231313213123L; String source2 = "IAvzjI19"; System.out.println(source1 + " encode -> " + encode(source1, chars)); System.out.println(source2 + " decode -> " + decode(source2, chars)); } /** * 將數位轉為62進位制 * * @param num Long 型數位 * @return 62進位制字串 */ public static String encode(long num, String chars) { StringBuilder sb = new StringBuilder(); int remainder; while (num > scale - 1) { remainder = Long.valueOf(num % scale).intValue(); sb.append(chars.charAt(remainder)); num = num / scale; } sb.append(chars.charAt(Long.valueOf(num).intValue())); return sb.reverse().toString(); } /** * 62進位制字串轉為數位 * * @param str 編碼後的62進位制字串 * @return 解碼後的 10 進位制字串 */ public static long decode(String str, String chars) { long num = 0; int index; for (int i = 0; i < str.length(); i++) { index = chars.indexOf(str.charAt(i)); num += (long) (index * (Math.pow(scale, str.length() - i - 1))); } return num; } }
在進位制轉換的過程中,我們可以看到對應的進位制有字元集,例如:十六進位制字元集為0123456789ABCDEF,在轉換後得到的值假設為12,對應的就是字元集的下標位置(下標從0開始算)為12的值C。那麼低進位制轉高進位制除了縮減位數外,我們還可以打亂字元集,獲取到的值別人就不容易輕易的猜到實際值,有一點加密的效果。將十六進位制字元集打亂為37AF126BCDE95480,那麼12對應的值就是5,按常規字元集推算原本的值就會得到錯誤值。
還有其他問題要注意,字元集確定後編碼了一些資料後,如果在修改字元集就會導致已有資料再解碼的時候出錯,無法解碼得到正確的資料,所以不要輕易修改字元集。
修改了字元集要做舊資料處理,或者編碼的時候加上字元集版本號,然後在解碼的時候根據版本號對應的字元集解碼。
到此這篇關於基於Java實現進位制轉換工具類的範例程式碼的文章就介紹到這了,更多相關Java進位制轉換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45