最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java進制轉換工具類實現(xiàn)減少參數(shù)長度

 更新時間:2023年02月22日 14:13:36   作者:iiopsd  
這篇文章主要為大家介紹了java進制轉換工具類實現(xiàn)減少參數(shù)長度示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

背景

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

原理

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

二進制:101001101
轉換為對應的四進制為:11031
轉換為對應的八進制為:515
轉換為對應的十進制為:333
轉換為對應的十六進制為:14d
轉換為對應的三十二進制為:ad

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

十進制A轉換為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作為下標取到對應的N進制的值Rn;
6、Rn,Rn-1,...,R2,R1拼接起來就得到N進制數(shù)R

用以上方法,如果是轉換為十六進制,我們帶入看下結果
十六進制值為0123456789ABCDEFA = 812, N = 16

1、812除以16,商數(shù)為50,余數(shù)為12(對應十六進制數(shù):C);
2、將50除以16,商數(shù)為3,余數(shù)為2(對應十六進制數(shù):2);
3、將3除以16,商數(shù)為0,余數(shù)為3(對應十六進制數(shù):3);
4、所以R = 32C

N進制R轉換為十進制A

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

S0=R0∗N0S_0 = R_0*N^0S0=R0∗N0
S1=R1∗N1S_1 = R_1*N^1S1=R1∗N1
S2=R2∗N2S_2 = R_2*N^2S2=R2∗N2
A=S0+S1+S2A =S_0 + S_1 + S_2A=S0+S1+S2

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

S0=1∗160S_0 = 1*16^0S0=1∗160 = 1 * 1 = 1
S1=F∗161S_1 = F*16^1S1=F∗161 = F + 16 = 15 * 16 = 240
S2=8∗162S_2 = 8*16^2S2=8∗162 = 8 * 256 = 2048
A=1+240+2048=2289A =1 + 240 + 2048 = 2289A=1+240+2048=2289

應用

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

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

/**
* 支持 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));
   }
   /**
     * 將數(shù)字轉為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進制字符串轉為數(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;
    }
}

延伸

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

還有其他問題要注意,字符集確定后編碼了一些數(shù)據(jù)后,如果在修改字符集就會導致已有數(shù)據(jù)再解碼的時候出錯,無法解碼得到正確的數(shù)據(jù),所以不要輕易修改字符集。

修改了字符集要做舊數(shù)據(jù)處理,或者編碼的時候加上字符集版本號,然后在解碼的時候根據(jù)版本號對應的字符集解碼。

以上就是java進制轉換工具類實現(xiàn)減少參數(shù)長度的詳細內容,更多關于java進制轉換減少參數(shù)長度的資料請關注腳本之家其它相關文章!

相關文章

  • Springboot整合easyexcel實現(xiàn)一個接口任意表的Excel導入導出

    Springboot整合easyexcel實現(xiàn)一個接口任意表的Excel導入導出

    本文主要介紹了Springboot整合easyexcel實現(xiàn)一個接口任意表的Excel導入導出,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Spring?Boot自動配置源碼實例解析

    Spring?Boot自動配置源碼實例解析

    Spring Boot作為Java領域最為流行的快速開發(fā)框架之一,其核心特性之一就是其強大的自動配置機制,下面這篇文章主要給大家介紹了關于Spring?Boot自動配置源碼的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • Spring中的八大模式簡單介紹

    Spring中的八大模式簡單介紹

    這篇文章主要介紹了Spring中的八大模式簡單介紹,結合實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Java遞歸求和1+2+3+...+n實例詳解

    Java遞歸求和1+2+3+...+n實例詳解

    在本篇文章里小編給大家?guī)砹岁P于Java遞歸求和1+2+3+...+n實例內容,需要的朋友們可以學習參考下。
    2020-01-01
  • 解析iReport自定義行數(shù)分頁的操作方法

    解析iReport自定義行數(shù)分頁的操作方法

    ireport默認都是自動分頁數(shù)據(jù)超出頁面長度就會自動分到下一頁,但有時候業(yè)務需要一頁只顯示固定幾行這時候就需要自定義條數(shù)了。下面看具體操作吧
    2021-10-10
  • Java方法調用解析靜態(tài)分派動態(tài)分派執(zhí)行過程

    Java方法調用解析靜態(tài)分派動態(tài)分派執(zhí)行過程

    這篇文章主要為大家介紹了Java方法調用解析靜態(tài)分派動態(tài)分派執(zhí)行過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Spring boot+beetl+i18n國際化處理的方法

    Spring boot+beetl+i18n國際化處理的方法

    這篇文章主要介紹了Spring boot+beetl+i18n國際化處理的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • CompletableFuture創(chuàng)建及功能使用全面詳解

    CompletableFuture創(chuàng)建及功能使用全面詳解

    這篇文章主要為大家介紹了CompletableFuture創(chuàng)建及功能使用全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java實現(xiàn)滑動驗證碼生成(后端工具類)

    Java實現(xiàn)滑動驗證碼生成(后端工具類)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)滑動驗證碼生成功能中的后端工具類部分,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-10-10
  • springboot2.3 整合mybatis-plus 高級功能及用法詳解

    springboot2.3 整合mybatis-plus 高級功能及用法詳解

    這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級功能,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論

九江市| 星子县| 铜山县| 恩平市| 个旧市| 红河县| 锡林浩特市| 福鼎市| 洛浦县| 嘉兴市| 乐业县| 石楼县| 南澳县| 张家界市| 迁安市| 泸溪县| 赤壁市| 车致| 抚顺县| 白沙| 盐边县| 文山县| 苏尼特右旗| 宜州市| 琼海市| 罗山县| 巴里| 东明县| 宿迁市| 龙江县| 宁安市| 普洱| 育儿| 稻城县| 平江县| 广灵县| 通城县| 高雄县| 荔波县| 莆田市| 于都县|