通過BigInteger真正實現無限大的十進制轉N(任意整數)進制

package com.wekture.oframe;

import java.math.BigInteger;

public class Test123 {

  /**
   * 初始化 62 進制數據,索引位置代表字符的數值,比如 A代表10,z代表61等
   */
  private static String chars =
      "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ豐王井開夫天無元專雲扎藝木五支廳不太犬區歷尤友匹車巨牙屯比互切瓦止少日中岡貝內水見午牛手毛氣升長仁什片僕化仇幣仍僅斤爪反介父從今兇分乏公倉月氏勿欠風丹勻烏鳳勾文六方火爲鬥憶訂計戶認心尺引醜巴孔隊辦以允予勸雙書幻玉刊示末未擊打巧正撲扒功扔去甘世古節本術可丙左厲右石布龍平滅軋東卡北佔業舊帥歸且旦目葉甲申叮電號田由史只央兄叼叫另叨嘆四生失禾丘付仗代仙們儀白仔他斥瓜乎叢令用甩印樂句匆冊犯外處冬鳥務包飢主市立閃蘭半汁匯頭漢寧穴它討寫讓禮訓必議訊記永司尼民出遼奶奴加召皮邊發孕聖對臺矛糾母幼絲式刑動扛寺吉扣考託老執鞏圾擴掃地揚場耳共芒亞芝朽樸機權過臣再協西壓厭在有百存而頁匠誇奪灰達列死成夾軌邪劃邁畢至此貞師塵尖劣光當早吐嚇蟲曲團同吊喫因吸嗎嶼帆歲回豈剛則肉網年朱先丟舌竹遷喬偉傳乒乓休伍伏優伐延件任傷價份華仰仿夥僞自血向似後行舟全會殺合兆企衆爺傘創肌朵雜危旬旨負各名多爭色壯衝冰莊慶亦劉齊交次衣產決充妄閉問闖羊並關米燈州汗污江池湯忙興宇守宅字安講軍許論農諷設訪尋那迅盡導異孫陣陽收階陰防奸如婦好她媽戲羽觀歡買紅纖級約紀馳巡壽弄麥形進戒吞遠違運扶撫壇技壞擾拒找批扯址走抄壩貢攻赤折抓扮搶孝均拋投墳抗坑坊抖護殼志扭塊聲把報卻劫芽花芹芬蒼芳嚴蘆勞克蘇杆槓杜材村杏極李楊求更束豆兩麗醫辰勵否還殲來連步堅旱盯呈時吳助縣裏呆園曠圍呀噸足郵男困吵串員聽吩吹嗚吧吼別崗帳財針釘告我亂利禿秀私每兵估體何但伸作伯伶傭低你住位伴身皁佛近徹役返餘希坐谷妥含鄰岔肝肚腸龜免狂猶角刪條卵島迎飯飲系言凍狀畝況牀庫療應冷這序辛棄冶忘閒間悶判竈燦弟汪沙汽沃泛溝沒沈沉懷憂快完宋宏牢究窮災良證啓評補初社識訴診詞譯君靈即層尿尾遲局改張忌際陸阿陳阻附妙妖妨努忍勁雞驅純紗納綱駁縱紛紙紋紡驢紐奉玩環武青責現表規抹攏拔揀擔坦押抽拐拖拍者頂拆擁抵拘勢抱垃拉攔拌幸招坡披撥擇擡其取苦若茂蘋苗英範直茄莖茅林枝杯櫃析板松槍構傑述枕喪或畫臥事刺棗雨賣礦碼廁奔奇奮態歐壟妻轟頃轉斬輪軟到非叔肯齒些虎虜腎賢尚旺具果味昆國昌暢明易昂典固忠咐呼鳴詠呢岸巖帖羅幟嶺凱敗販購圖釣制知垂牧物乖刮稈和季委佳侍供使例版侄偵側憑僑佩貨依的迫質欣徵往爬彼徑所舍金命斧爸採受乳貪念貧膚肺肢腫脹朋股肥服脅周昏魚兔狐忽狗備飾飽飼變京享店夜廟府底劑郊廢淨盲放刻育閘鬧鄭券卷單炒炊炕炎爐沫淺法泄河沾淚油泊沿泡注瀉泳泥沸波潑澤治怖性怕憐怪學寶宗定宜審宙官空簾實試郎詩肩房誠襯衫視話誕詢該詳建肅錄隸居屆刷屈弦承孟孤陝降限妹姑姐姓始駕參艱線練組細駛織終駐駝紹經貫奏春幫珍玻毒型掛封持項垮挎城撓政赴趙擋挺括拴拾挑指墊掙擠拼挖按揮挪某甚革薦巷帶草繭茶荒茫蕩榮故胡南藥標枯柄棟相查柏柳柱柿欄樹要鹹威歪研磚釐厚砌砍面耐耍牽殘殃輕鴉皆背戰點臨覽豎省削嘗是盼眨哄顯啞冒映星昨畏趴胃貴界虹蝦蟻思螞雖品咽罵譁咱響哈咬咳哪炭峽罰賤貼骨鈔鍾鋼鑰鉤卸缸拜看矩怎牲選適秒香種秋科重複竿段便倆貸順修保促侮儉俗俘信皇泉鬼侵追俊盾待律很須敘劍逃食盆膽勝胞胖脈勉狹獅獨狡獄狠貿怨急饒蝕餃餅彎將獎哀亭亮度跡庭瘡瘋疫疤姿親音帝施聞閥閣差養美姜叛送類迷前首逆總煉炸炮爛剃潔洪灑澆濁洞測洗活派洽染濟洋洲渾濃津恆恢恰惱恨舉覺宣室宮憲突穿竊客冠語扁襖祖神祝誤誘說誦墾退既屋晝費陡眉孩除險院娃姥姨姻嬌怒架賀盈勇怠柔壘綁絨結繞驕繪給絡駱絕絞統耕耗豔泰珠班素蠶頑盞匪撈栽捕振載趕起鹽捎捏埋捉捆捐損都哲逝撿換挽熱恐壺挨恥耽恭蓮莫荷獲晉惡真框桂檔桐株橋桃格校覈樣根索哥速逗慄配翅辱脣夏礎破原套逐烈殊顧轎較頓斃致柴桌慮監緊黨曬眠曉鴨晃晌暈蚊哨哭恩喚啊唉罷峯圓賊賄錢鉗鑽鐵鈴鉛缺氧特犧造乘敵秤租積秧秩稱祕透筆笑筍債借值倚傾倒倘俱倡候俯倍倦健臭射躬息徒徐艦艙般航途拿爹愛頌翁脆脂胸胳髒膠腦狸狼逢留皺餓戀槳漿衰高席準座脊症病疾疼疲效離唐資涼站剖競部旁旅畜閱羞瓶拳粉料益兼烤烘煩燒燭煙遞濤浙澇酒涉消浩海塗浴浮流潤浪浸漲燙湧悟悄悔悅害寬家宵宴賓窄容宰案請朗諸讀扇襪袖袍被祥課誰調冤諒談誼剝懇展劇屑弱陵陶陷陪娛娘通能難預桑絹繡驗繼球理捧堵描域掩捷排掉堆推掀授教掏掠培接控探據掘職基著勒黃萌蘿菌菜萄菊萍菠營械夢梢梅檢梳梯桶救副票戚爽聾襲盛雪輔輛虛雀堂常匙晨睜眯眼懸野啦晚啄距躍略蛇累唱患唯崖嶄崇圈銅鏟銀甜梨犁移笨籠笛符第敏做袋悠償偶偷您售停偏假得銜盤船斜盒鴿悉欲彩領腳脖臉脫象夠猜豬獵貓猛餡館湊減毫麻癢痕廊康庸鹿盜章竟商族旋望率着蓋粘粗粒斷剪獸清添淋淹渠漸混漁淘液淡深婆梁滲情惜慚悼懼惕驚慘慣寇寄宿窯密謀謊禍謎逮敢屠彈隨蛋隆隱婚嬸頸績緒續騎繩維綿綢綠瑞魂肆攝摸填搏塌鼓擺攜搬搖搞塘攤蒜勤鵲藍墓幕蓬蓄蒙蒸獻禁楚想槐榆樓概賴酬感礙碑碎碰碗碌雷零霧雹輸督齡鑑睛睡睬鄙愚暖盟歇暗照跨跳跪路跟遣蛾蜂嗓置罪罩錯錫鑼錘錦鍵鋸矮辭稠愁籌籤簡毀舅鼠催傻像躲微愈遙腰腥腹騰腿觸解醬痰廉新韻意糧數煎塑慈煤煌滿漠源濾濫滔溪溜滾濱粱灘慎譽塞謹福羣殿闢障嫌嫁疊縫纏靜碧璃牆撇嘉摧截誓境摘摔聚蔽慕暮蔑模榴榜榨歌遭酷釀酸磁願需弊裳顆嗽蜻蠟蠅蜘賺鍬鍛舞穩算籮管僚鼻魄貌膜膊膀鮮疑饅裹敲豪膏遮腐瘦辣竭端旗精歉熄熔漆漂漫滴演漏慢寨賽察蜜譜嫩翠熊凳騾縮琴斑替款堪搭塔越趁趨超提堤博揭喜插揪搜煮援裁擱摟攪握揉斯期欺聯散惹葬葛董葡敬蔥落朝辜葵棒棋植森椅椒棵棍棉棚棕惠惑逼廚廈硬確雁殖裂雄暫雅輩悲紫輝敞賞掌晴暑最量噴晶喇遇喊景踐跌跑遺蛙蛛蜓喝喂喘喉幅帽賭賠黑鑄鋪鏈銷鎖鋤鍋鏽鋒銳短智毯鵝剩稍程稀稅筐等築策篩筒答筋箏傲傅牌堡集焦傍儲奧街懲御循艇舒番釋禽臘脾腔魯猾猴然饞裝蠻就痛童闊善羨普糞尊道曾焰港湖渣溼溫渴滑灣渡遊滋溉憤慌惰愧愉慨割寒富竄窩窗遍裕褲裙謝謠謙屬屢強粥疏隔隙絮嫂登緞緩編騙緣";
  private static BigInteger scale = new BigInteger("2348", 10);

  /**
   * 將數字轉爲62進制+458
   *
   * @param num Long 型數字
   * @param length 轉換後的字符串長度,不足則左側補0
   * @return 62進制字符串
   */
  public static String encode(BigInteger num) {
    StringBuilder sb = new StringBuilder();
    BigInteger remainder = new BigInteger("0", 10);

    while (num.compareTo(scale.subtract(new BigInteger("1", 10))) == 1) {
      /**
       * 對 scale 進行求餘,然後將餘數追加至 sb 中,由於是從末位開始追加的,因此最後需要反轉(reverse)字符串
       */
      remainder = num.mod(scale);
      int remainderInt = remainder.intValue();
      sb.append(chars.charAt(remainderInt));

      num = num.divide(scale);
    }

    sb.append(chars.charAt(num.intValue()));
    String value = sb.reverse().toString();
    return value;
  }

  /**
   * 62進制字符串轉爲數字
   *
   * @param str 編碼後的62進制字符串
   * @return 解碼後的 10 進制字符串
   */
  public static BigInteger decode(String str) {
    /**
     * 將 0 開頭的字符串進行替換
     */
    str = str.replace("^0*", "");
    BigInteger num = new BigInteger("0");
    int index = 0;
    for (int i = 0; i < str.length(); i++) {
      /**
       * 查找字符的索引位置
       */
      index = chars.indexOf(str.charAt(i));
      /**
       * 索引位置代表字符的數值
       */
      // num += (long)(index * (Math.pow(scale.longValue(), str.length() - i - 1)));
      BigInteger bigIndex = new BigInteger(index + "", 10);
      BigInteger temp = scale.pow(str.length() - i - 1);
      num = num.add(bigIndex.multiply(temp));


    }

    return num;
  }

  /**
   * @param args 1316FmjUYeyZydnWzUBi6s16WmiZen
   */
  public static void main(String[] args) {
    String intStr =
        "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
    intStr = intStr + intStr + intStr +intStr;
    System.out.println("62進制:" + encode(new BigInteger(intStr, 2)));
    System.out.println("10進制:" + decode(
        "s9zCnPkWj35ur8OIwpNsJEw$MoIG$$E87JLzeJ3K2eA1j^M1IQ-iIF6#vfgmb#Bg=0-Y&=Xqv2my1*lUv"));
    System.out.println((new BigInteger(intStr,2).toString(36)));
  }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章