溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于Java如何實現(xiàn)進制轉(zhuǎn)換工具類

發(fā)布時間:2023-02-20 09:09:55 來源:億速云 閱讀:111 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了基于Java如何實現(xiàn)進制轉(zhuǎn)換工具類的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇基于Java如何實現(xiàn)進制轉(zhuǎn)換工具類文章都會有所收獲,下面我們一起來看看吧。

    背景

    最近有個發(fā)送短信的功能,需要在短信中帶有詳情鏈接,鏈接中帶有對應(yīng)信息且要有校驗功能,然而短信是按字數(shù)收費的,所以鏈接要盡可能的短。鏈接中帶有數(shù)字類型參數(shù),就想到通過低進制轉(zhuǎn)高進制可以減少參數(shù)長度。

    原理

    低進制轉(zhuǎn)換到高進制的時候可能會減少位數(shù),例如二進制是滿二進一,十進制是滿十進一。

    二進制:101001101

    • 轉(zhuǎn)換為對應(yīng)的四進制為:11031

    • 轉(zhuǎn)換為對應(yīng)的八進制為:515

    • 轉(zhuǎn)換為對應(yīng)的十進制為:333

    • 轉(zhuǎn)換為對應(yīng)的十六進制為:14d

    • 轉(zhuǎn)換為對應(yīng)的三十二進制為:ad

    我們平常用的都是十進制的數(shù)值,就以十進制來講解下轉(zhuǎn)換方法。

    十進制A轉(zhuǎn)換為N進制R

    1、A除以N,商數(shù)為S1,余數(shù)為Y1;

    2、將S1除以N,商數(shù)為S2,余數(shù)為Y2;

    3、將S2除以N,商數(shù)為S3,余數(shù)為Y3;

    4、循環(huán)n次直到商數(shù)為0,余數(shù)為Yn(Yn < N,n為下標,代表循環(huán)次數(shù));

    5、將余數(shù)Yn作為下標取到對應(yīng)的N進制的值Rn;

    6、Rn,Rn-1,...,R2,R1拼接起來就得到N進制數(shù)R

    用以上方法,如果是轉(zhuǎn)換為十六進制,我們帶入看下結(jié)果

    十六進制值為0123456789ABCDEFA = 812, N = 16

    1、812除以16,商數(shù)為50,余數(shù)為12(對應(yīng)十六進制數(shù):C);

    2、將50除以16,商數(shù)為3,余數(shù)為2(對應(yīng)十六進制數(shù):2);

    3、將3除以16,商數(shù)為0,余數(shù)為3(對應(yīng)十六進制數(shù):3);

    4、所以R = 32C

    N進制R轉(zhuǎn)換為十進制A

    假設(shè)R有三位數(shù) R2R1R0,從右到左開始處理數(shù)據(jù)

    S0=R0&lowast;N0

    S1=R1&lowast;N1

    S2=R2&lowast;N2

    A=S0+S1+S2

    帶入實際數(shù)字實踐一下十六進制8F1轉(zhuǎn)換過程

    S0=1&lowast;160 = 1 * 1 = 1

    S1=F&lowast;161 = F + 16 = 15 * 16 = 240

    S2=8&lowast;162 = 8 * 256 = 2048

    A=1+240+2048=2289

    應(yīng)用

    前面以十進制和十六進制轉(zhuǎn)換舉例是為了更好幫助大家理解轉(zhuǎn)換的方式,在應(yīng)用的過程中我們會發(fā)現(xiàn)十進制轉(zhuǎn)十六進制并不能減少很多數(shù)字的位數(shù),那么我們就可以使用三十二進制,甚至是六十二進制。

    六十二進制轉(zhuǎn)換工具類實現(xiàn):

    /**
    * 支持 import Java 標準庫 (JDK 1.8)
    */
    import java.util.*;
    
    /**
    * 六十二進制轉(zhuǎn)換工具類
    */
    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));
       }
    
       /**
         * 將數(shù)字轉(zhuǎn)為62進制
         *
         * @param num Long 型數(shù)字
         * @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進制字符串轉(zhuǎn)為數(shù)字
         *
         * @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;
        }
    }

    延伸

    在進制轉(zhuǎn)換的過程中,我們可以看到對應(yīng)的進制有字符集,例如:十六進制字符集為0123456789ABCDEF,在轉(zhuǎn)換后得到的值假設(shè)為12,對應(yīng)的就是字符集的下標位置(下標從0開始算)為12的值C。那么低進制轉(zhuǎn)高進制除了縮減位數(shù)外,我們還可以打亂字符集,獲取到的值別人就不容易輕易的猜到實際值,有一點加密的效果。將十六進制字符集打亂為37AF126BCDE95480,那么12對應(yīng)的值就是5,按常規(guī)字符集推算原本的值就會得到錯誤值。

    還有其他問題要注意,字符集確定后編碼了一些數(shù)據(jù)后,如果在修改字符集就會導(dǎo)致已有數(shù)據(jù)再解碼的時候出錯,無法解碼得到正確的數(shù)據(jù),所以不要輕易修改字符集。修改了字符集要做舊數(shù)據(jù)處理,或者編碼的時候加上字符集版本號,然后在解碼的時候根據(jù)版本號對應(yīng)的字符集解碼。

    關(guān)于“基于Java如何實現(xiàn)進制轉(zhuǎn)換工具類”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“基于Java如何實現(xiàn)進制轉(zhuǎn)換工具類”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI