/* Ċ Ġ* ĠCopyright Ġ 2 0 1 1 ĠGoogle ĠInc . Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠNew ĠVector ĠLtd Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġim . vector . matrix . android . internal . crypto . keys backup . util Ċ Ċ import Ġjava . math . BigInteger Ċ Ċ /** Ċ Ġ* ĠRef : Ġhttps :// github . com / bitcoin - labs / bitcoin - mobile - android / blob / master / src / bitcoin j / java / com / google / bitcoin / core / Base 5 8 . java Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠA Ġcustom Ġform Ġof Ġbase 5 8 Ġis Ġused Ġto Ġencode ĠBit Coin Ġaddresses . ĠNote Ġthat Ġthis Ġis Ġnot Ġthe Ġsame Ġbase 5 8 Ġas Ġused Ġby Ċ Ġ* ĠF lickr , Ġwhich Ġyou Ġmay Ġsee Ġreference Ġto Ġaround Ġthe Ġinternet . Ċ Ġ* Ċ Ġ* ĠSat oshi Ġsays : Ġwhy Ġbase - 5 8 Ġinstead Ġof Ġstandard Ġbase - 6 4 Ġencoding ? Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠDon 't Ġwant Ġ 0 O Il Ġcharacters Ġthat Ġlook Ġthe Ġsame Ġin Ġsome Ġfonts Ġand Ċ Ġ* Ġcould Ġbe Ġused Ġto Ġcreate Ġvis ually Ġidentical Ġlooking Ġaccount Ġnumbers . Ċ Ġ* Ġ Ġ* ĠA Ġstring Ġwith Ġnon - al phanumeric Ġcharacters Ġis Ġnot Ġas Ġeasily Ġaccepted Ġas Ġan Ġaccount Ġnumber . Ċ Ġ* Ġ Ġ* ĠE - mail Ġusually Ġwon 't Ġline - break Ġif Ġthere 's Ġno Ġpunctuation Ġto Ġbreak Ġat . Ċ Ġ* Ġ Ġ* ĠDouble click ing Ġselects Ġthe Ġwhole Ġnumber Ġas Ġone Ġword Ġif Ġit 's Ġall Ġal phanumeric . Ċ Ġ* Ċ Ġ*/ Ċ private Ġconst Ġval ĠAL PH AB ET Ġ= Ġ" 1 2 3 4 5 6 7 8 9 ABCDEF GH J KLM NP Q RST UV W XYZ abcdefgh ijk mnopqrst uvw xyz " Ċ private Ġval ĠBASE Ġ= ĠBigInteger . valueOf ( 5 8 ) Ċ Ċ /** Ċ Ġ* ĠEncode Ġa Ġbyte Ġarray Ġto Ġa Ġhuman Ġreadable Ġstring Ġwith Ġbase 5 8 Ġchars Ċ Ġ*/ Ċ fun Ġbase 5 8 encode ( input : ĠByteArray ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġbi Ġ= ĠBigInteger ( 1 , Ġinput ) ĊĠĠĠ Ġval Ġs Ġ= ĠStringBuffer () ĊĠĠĠ Ġwhile Ġ( bi Ġ>= ĠBASE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmod Ġ= Ġbi . mod ( BASE ) ĊĠĠĠĠĠĠĠ Ġs . insert ( 0 , ĠAL PH AB ET [ mod . toInt ()]) ĊĠĠĠĠĠĠĠ Ġbi Ġ= Ġbi . subtract ( mod ). divide ( BASE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġs . insert ( 0 , ĠAL PH AB ET [ bi . toInt ()]) ĊĠĠĠ Ġ// ĠConvert Ġleading Ġzeros Ġtoo . ĊĠĠĠ Ġfor Ġ( an Input Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( an Input . toInt () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . insert ( 0 , ĠAL PH AB ET [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġs . toString () Ċ } Ċ Ċ /** Ċ Ġ* ĠDecode Ġa Ġbase 5 8 ĠString Ġto Ġa Ġbyte Ġarray Ċ Ġ*/ Ċ fun Ġbase 5 8 decode ( input : ĠString ): ĠByteArray Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġdecode To BigInteger ( input ). toByteArray () ĊĊĠĠĠ Ġ// ĠRemove Ġthe Ġfirst Ġleading Ġzero Ġif Ġany ĊĠĠĠ Ġif Ġ( result [ 0 ] Ġ== Ġ 0 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . copyOf Range ( 1 , Ġresult . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun Ġdecode To BigInteger ( input : ĠString ): ĠBigInteger Ġ{ ĊĠĠĠ Ġvar Ġbi Ġ= ĠBigInteger . valueOf ( 0 ) ĊĠĠĠ Ġ// ĠWork Ġbackwards Ġthrough Ġthe Ġstring . ĊĠĠĠ Ġfor Ġ( i Ġin Ġinput . length Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalpha Index Ġ= ĠAL PH AB ET . indexOf ( input [ i ]) ĊĠĠĠĠĠĠĠ Ġbi Ġ= Ġbi . add ( BigInteger . valueOf ( alpha Index . to Long ()). multiply ( BASE . pow ( input . length Ġ- Ġ 1 Ġ- Ġi ))) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbi Ċ } Ċ