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

基于Java實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換工具類的示例代碼

 更新時(shí)間:2023年02月19日 14:01:45   作者:iiopsd  
這篇文章主要為大家詳細(xì)介紹了如何基于Java實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換工具類,從而實(shí)現(xiàn)減少參數(shù)長度的效果,文中的示例代碼講解詳細(xì),需要的可以參考一下

背景

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

原理

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

二進(jìn)制:101001101

  • 轉(zhuǎn)換為對應(yīng)的四進(jìn)制為:11031
  • 轉(zhuǎn)換為對應(yīng)的八進(jìn)制為:515
  • 轉(zhuǎn)換為對應(yīng)的十進(jìn)制為:333
  • 轉(zhuǎn)換為對應(yīng)的十六進(jìn)制為:14d
  • 轉(zhuǎn)換為對應(yīng)的三十二進(jìn)制為:ad

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

十進(jìn)制A轉(zhuǎn)換為N進(jì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為下標(biāo),代表循環(huán)次數(shù));

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

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

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

十六進(jìn)制值為0123456789ABCDEFA = 812, N = 16

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

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

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

4、所以R = 32C

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

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

S0?=R0?∗N0

S1?=R1?∗N1

S2=R2∗N2

A=S0?+S1?+S2?

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

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

應(yīng)用

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

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

/**
* 支持 import Java 標(biāo)準(zhǔn)庫 (JDK 1.8)
*/
import java.util.*;

/**
* 六十二進(jìn)制轉(zhuǎn)換工具類
*/
public class Main {

  // 將字符集打亂就會(huì)帶有一點(diǎn)加密效果
  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進(jìn)制
     *
     * @param num Long 型數(shù)字
     * @return 62進(jìn)制字符串
     */
    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進(jìn)制字符串轉(zhuǎn)為數(shù)字
     *
     * @param str 編碼后的62進(jìn)制字符串
     * @return 解碼后的 10 進(jìn)制字符串
     */
    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;
    }
}

延伸

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

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

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

到此這篇關(guān)于基于Java實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換工具類的示例代碼的文章就介紹到這了,更多相關(guān)Java進(jìn)制轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟

    SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟

    這篇文章主要介紹了SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用Spring框架,感興趣的朋友可以了解下
    2021-05-05
  • JAVA模擬多線程給多用戶發(fā)送短信

    JAVA模擬多線程給多用戶發(fā)送短信

    這篇文章主要介紹了JAVA模擬多線程給多用戶發(fā)送短信,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot基于RabbitMQ實(shí)現(xiàn)消息可靠性的方法

    SpringBoot基于RabbitMQ實(shí)現(xiàn)消息可靠性的方法

    RabbitMQ 提供了 publisher confirm 機(jī)制來避免消息發(fā)送到 MQ 過程中丟失,這種機(jī)制必須給每個(gè)消息指定一個(gè)唯一ID,消息發(fā)送到MQ以后,會(huì)返回一個(gè)結(jié)果給發(fā)送者,表示消息是否處理成功,本文給大家介紹了SpringBoot基于RabbitMQ實(shí)現(xiàn)消息可靠性的方法,需要的朋友可以參考下
    2024-04-04
  • springboot國際化多語言配置方式

    springboot國際化多語言配置方式

    這篇文章主要介紹了springboot國際化多語言配置方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java多線程 原子性操作類的使用

    Java多線程 原子性操作類的使用

    這篇文章主要介紹了Java多線程 原子性操作類的使用,在java5以后,我們接觸到了線程原子性操作,也就是在修改時(shí)我們只需要保證它的那個(gè)瞬間是安全的即可,經(jīng)過相應(yīng)的包裝后可以再處理對象的并發(fā)修改,本文總結(jié)一下Atomic系列的類的使用方法,下面一起進(jìn)入文章了解詳細(xì)內(nèi)容
    2021-10-10
  • JFormDesigner(IDEA)下載方法

    JFormDesigner(IDEA)下載方法

    JFormDesigner是一種Java Swing GUI設(shè)計(jì)工具,可快速創(chuàng)建用戶界面,支持多種布局管理器,如GridBagLayout、SpringLayout等,本文給大家介紹JFormDesigner(IDEA)下載方法,感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • Java?將Excel轉(zhuǎn)為UOS的操作方法

    Java?將Excel轉(zhuǎn)為UOS的操作方法

    以.uos為后綴的文件,表示Uniform?Office?Spreadsheet文件,是一種國產(chǎn)的辦公文件格式,該格式以統(tǒng)一辦公格式(UOF)創(chuàng)建,使用XML和壓縮保存電子表格,這篇文章主要介紹了Java?將Excel轉(zhuǎn)為UOS,需要的朋友可以參考下
    2022-09-09
  • Java類的訪問權(quán)限關(guān)鍵字用法說明

    Java類的訪問權(quán)限關(guān)鍵字用法說明

    這篇文章主要介紹了Java類的訪問權(quán)限關(guān)鍵字用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • mybatis-plus調(diào)用update方法時(shí),自動(dòng)填充字段不生效問題及解決

    mybatis-plus調(diào)用update方法時(shí),自動(dòng)填充字段不生效問題及解決

    這篇文章主要介紹了mybatis-plus調(diào)用update方法時(shí),自動(dòng)填充字段不生效問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行

    Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行

    這篇文章主要介紹了Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行,在本節(jié)示例中,我們將創(chuàng)建兩個(gè)線程,一個(gè)是普通線程,向隊(duì)列中寫入事件,另外一個(gè)是守護(hù)線程,清除隊(duì)列中的事件,需要的朋友可以參考下
    2014-12-12

最新評論

长治市| 且末县| 百色市| 兴仁县| 东乡族自治县| 鄯善县| 九寨沟县| 桃园市| 盐源县| 临颍县| 海丰县| 临高县| 朝阳市| 民勤县| 五莲县| 涟源市| 乌拉特前旗| 泾源县| 通城县| 颍上县| 碌曲县| 丽水市| 黔西县| 交城县| 安西县| 永康市| 锦屏县| 新营市| 高邮市| 县级市| 呼和浩特市| 陆良县| 丹阳市| 通城县| 安顺市| 大厂| 阜阳市| 团风县| 滦平县| 万安县| 孝感市|