package Ġir . me h di y ari . f allery . utils Ċ Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* Ġgithub Ġgist Ġ-> Ġhttps :// gist . github . com / me h di y ari / dd 2 5 6 9 de 8 a 2 7 2 a 9 1 4 6 8 9 8 d 9 8 d 7 3 7 a 7 d 6 Ċ Ġ* Ġsimple ĠBase 8 5 / Ascii 8 5 Ġencoder - decoder Ġfor Ġkotlin Ċ Ġ* Ġ@ see Ġ< a Ġhref =" Base 8 5 "> https :// en . wikipedia . org / wiki / Ascii 8 5 </ a > Ċ Ġ*/ Ċ Ċ private Ġconst Ġval Ġascii 8 5 Shift Ġ= Ġ 3 3 Ċ private Ġval Ġbase 8 5 Pow Ġ= Ġint ArrayOf ( 1 , Ġ 8 5 , Ġ 8 5 Ġ* Ġ 8 5 , Ġ 8 5 Ġ* Ġ 8 5 Ġ* Ġ 8 5 , Ġ 8 5 Ġ* Ġ 8 5 Ġ* Ġ 8 5 Ġ* Ġ 8 5 ) Ċ private Ġval Ġremove WhiteSpace Pattern Ġ= ĠPattern . compile ("\\ s +") Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġencoding Ġ[ ByteArray ] Ġto ĠBase 8 5 Ċ Ġ*/ Ċ fun ĠByteArray . encode To Base 8 5 (): ĠString Ġ= ĠStringBuilder ( this . size Ġ* Ġ 5 Ġ/ Ġ 4 ). also Ġ{ ĠstringBuilder Ġ-> ĊĠĠĠ ĠByteArray ( 4 ). also Ġ{ Ġchunk Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġthis . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġthis [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġbyte ToInt ( chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (' z ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( encode Chunk ( value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . fill ( chunk , Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum P added Ġ= Ġchunk . size Ġ- Ġchunk Index ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . fill ( chunk , Ġchunk Index , Ġchunk . size , Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġbyte ToInt ( chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Chunk Ġ= Ġencode Chunk ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġencoded Chunk . size Ġ- Ġnum P added ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( encoded Chunk [ i ]) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }. toString () Ċ Ċ /** Ċ Ġ* Ġdecoding Ġ[ ByteArray ] Ġfrom ĠBase 8 5 Ċ Ġ*/ Ċ fun ĠString . decode From Base 8 5 (): ĠByteArray Ġ{ ĊĠĠĠ Ġvar Ġcp Value : ĠString Ġ= Ġthis ĊĠĠĠ Ġval Ġdecoded Length Ġ= ĠBigDecimal . valueOf ( cp Value . length . to Long ()). multiply ( BigDecimal . valueOf ( 4 )). divide ( BigDecimal . valueOf ( 5 )) ĊĠĠĠ Ġreturn ĠByteBuffer . allocate ( decoded Length . toInt ()). also Ġ{ Ġbyte Buff Ġ-> ĊĠĠĠĠĠĠĠ Ġcp Value Ġ= Ġremove WhiteSpace Pattern . matcher ( cp Value ). replaceAll ("") ĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġcp Value . toByteArray ( StandardCharsets . US _ ASCII ) ĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= ĠByteArray ( 5 ) ĊĠĠĠĠĠĠĠ Ġvar Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpayload . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Byte Ġ= Ġpayload [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( curr Byte Ġ== Ġ' z '. to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( chunk Index Ġ<= Ġ 0 ) Ġ{ Ġ" The Ġpayload Ġis Ġnot Ġbase Ġ 8 5 Ġencoded ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġcurr Byte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ== Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Buff . put ( decode Chunk ( chunk )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . fill ( chunk , Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum P added Ġ= Ġchunk . size Ġ- Ġchunk Index ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . fill ( chunk , Ġchunk Index , Ġchunk . size , Ġ' u '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadded Decode Ġ= Ġdecode Chunk ( chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpadded Decode . size Ġ- Ġnum P added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Buff . put ( padded Decode [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbyte Buff . flip () ĊĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠ ĠArrays . copyOf ( it . array (), Ġit . limit ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġencode ĠInt Ġto ĠChar Array Ċ Ġ*/ Ċ private Ġfun Ġencode Chunk ( value : ĠInt ): ĠChar Array Ġ{ ĊĠĠĠ Ġvar Ġlong Value Ġ= Ġvalue . to Long () Ġand Ġ 0 x 0 0 0 0 0 0 0 0 ffffffff L ĊĠĠĠ Ġval Ġencoded Chunk Ġ= ĠChar Array ( 5 ) ĊĠĠĠ Ġencoded Chunk . forEach Indexed Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġencoded Chunk [ index ] Ġ= Ġ( longValue Ġ/ Ġbase 8 5 Pow [ 4 Ġ- Ġindex ] Ġ+ Ġascii 8 5 Shift ). to Char () ĊĠĠĠĠĠĠĠ Ġlong Value Ġ% = Ġbase 8 5 Pow [ 4 Ġ- Ġindex ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġencoded Chunk Ċ } Ċ Ċ /** Ċ Ġ* Ġdecode ĠInt Ġto ĠcharArray Ċ Ġ*/ Ċ private Ġfun Ġdecode Chunk ( chunk : ĠByteArray ): ĠByteArray Ġ{ ĊĠĠĠ Ġrequire ( chunk . size Ġ== Ġ 5 ) Ġ{ Ġ" You Ġcan Ġonly Ġdecode Ġchunks Ġof Ġsize Ġ 5 ." Ġ} ĊĠĠĠ Ġvar Ġvalue Ġ= Ġ 0 ĊĠĠĠ Ġvalue Ġ+= Ġ( chunk [ 0 ] Ġ- Ġascii 8 5 Shift ) Ġ* Ġbase 8 5 Pow [ 4 ] ĊĠĠĠ Ġvalue Ġ+= Ġ( chunk [ 1 ] Ġ- Ġascii 8 5 Shift ) Ġ* Ġbase 8 5 Pow [ 3 ] ĊĠĠĠ Ġvalue Ġ+= Ġ( chunk [ 2 ] Ġ- Ġascii 8 5 Shift ) Ġ* Ġbase 8 5 Pow [ 2 ] ĊĠĠĠ Ġvalue Ġ+= Ġ( chunk [ 3 ] Ġ- Ġascii 8 5 Shift ) Ġ* Ġbase 8 5 Pow [ 1 ] ĊĠĠĠ Ġvalue Ġ+= Ġ( chunk [ 4 ] Ġ- Ġascii 8 5 Shift ) Ġ* Ġbase 8 5 Pow [ 0 ] ĊĊĠĠĠ Ġreturn Ġint To Byte ( value ) Ċ } Ċ Ċ private Ġfun Ġbyte ToInt ( value : ĠByteArray ?): ĠInt Ġ{ ĊĠĠĠ Ġrequire (!( value Ġ== Ġnull Ġ|| Ġvalue . size Ġ!= Ġ 4 )) Ġ{ Ġ" You Ġcannot Ġcreate Ġan Ġint Ġwithout Ġexactly Ġ 4 Ġbytes ." Ġ} ĊĠĠĠ Ġreturn ĠByteBuffer . wrap ( value ). int Ċ } Ċ Ċ private Ġfun Ġint To Byte ( value : ĠInt ): ĠByteArray Ġ= Ġbyte ArrayOf ( value . ush r ( 2 4 ). to Byte (), Ġvalue . ush r ( 1 6 ). to Byte (), Ġvalue . ush r ( 8 ). to Byte (), Ġvalue . to Byte ())