package Ġuno . convert Ċ Ċ import Ġglm _. b Ċ import Ġglm _. i Ċ import Ġuno . glm . to Bid Dec Ċ import Ġunsigned . to UL ong Ċ import Ġjava . nio . ByteBuffer Ċ Ċ object ĠAsc ii 8 5 Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠASCII _ SHIFT Ġ= Ġ 3 3 ĊĊĠĠĠ Ġprivate Ġval ĠBASE 8 5 _ PO W Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 8 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 8 5 Ġ* Ġ 8 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 8 5 Ġ* Ġ 8 5 Ġ* Ġ 8 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 8 5 Ġ* Ġ 8 5 Ġ* Ġ 8 5 Ġ* Ġ 8 5 ) ĊĊĠĠĠ Ġfun Ġencode ( payload : ĠByteArray ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( payload . isEmpty ()) Ġthrow ĠIllegalArgumentException (" You Ġmust Ġprovide Ġa Ġnon - zero Ġlength Ġinput ") ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠBy Ġusing Ġfive ĠASCII Ġcharacters Ġto Ġrepresent Ġfour Ġbytes Ġof Ġbinary Ġdata Ġthe Ġencoded Ġsize Ġ Â ¹ âģ Ħ âĤ Ħ Ġis Ġlarger Ġthan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġoriginal ĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġstring Buff Ġ= ĠStringBuilder ( payload . size Ġ* Ġ 5 Ġ/ Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠWe Ġbreak Ġthe Ġpayload Ġinto Ġint Ġ( 4 Ġbytes ) ĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= ĠByteArray ( 4 ) ĊĠĠĠĠĠĠĠ Ġvar Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( curr Byte Ġin Ġpayload ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġcurr Byte ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ== Ġ 4 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġchunk . int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠBecause Ġall - zero Ġdata Ġis Ġquite Ġcommon , Ġan Ġexception Ġis Ġmade Ġfor Ġthe Ġsake Ġof Ġdata Ġcompression , Ġand Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall - zero Ġgroup Ġis Ġencoded Ġas Ġa Ġsingle Ġcharacter Ġ" z " Ġinstead Ġof Ġ" !!!! ! ". Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Buff . append (' z ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Buff . append ( encode Chunk ( value )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . fill ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠIf Ġwe Ġdidn 't Ġend Ġon Ġ 0 , Ġthen Ġwe Ġneed Ġsome Ġpadding ĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum P added Ġ= Ġchunk . size Ġ- Ġchunk Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . fill ( 0 , Ġchunk Index , Ġchunk . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġchunk . int ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Chunk Ġ= Ġencode Chunk ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġencoded Chunk . size Ġ- Ġnum P added ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Buff . append ( encoded Chunk [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstring Buff . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencode Chunk ( value : ĠInt ): ĠChar Array Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġtransform Ġvalue Ġto Ġunsigned Ġlong ĊĠĠĠĠĠĠĠ Ġvar Ġlong Value Ġ= Ġvalue . to UL ong () ĊĠĠĠĠĠĠĠ Ġval Ġencoded Chunk Ġ= ĠChar Array ( 5 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġencoded Chunk . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Chunk [ i ] Ġ= Ġ( longValue Ġ/ ĠBASE 8 5 _ PO W [ 4 Ġ- Ġi ] Ġ+ ĠASCII _ SHIFT ). toInt (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Value Ġ% = ĠBASE 8 5 _ PO W [ 4 Ġ- Ġi ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġencoded Chunk ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġa Ġvery Ġsimple Ġbase 8 5 Ġdecoder . ĠIt Ġrespect s Ġthe Ġ' z ' Ġoptimization Ġfor Ġempty Ġchunks , Ġand Ġstri ps Ġwhitespace ĊĠĠĠĠ Ġ* Ġbetween Ġcharacters Ġto Ġrespect Ġline Ġlimits . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġchars ĠThe Ġinput Ġcharacters Ġthat Ġare Ġbase 8 5 Ġencoded . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġbinary Ġdata Ġdecoded Ġfrom Ġthe Ġinput ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ Ascii 8 5 ]( https :// en . wikipedia . org / wiki / Ascii 8 5 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdecode ( chars : ĠString ): ĠByteArray Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chars . isEmpty ()) Ġthrow ĠIllegalArgumentException (" You Ġmust Ġprovide Ġa Ġnon - zero Ġlength Ġinput ") ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠBy Ġusing Ġfive ĠASCII Ġcharacters Ġto Ġrepresent Ġfour Ġbytes Ġof Ġbinary Ġdata Ġthe Ġencoded Ġsize Ġ Â ¹ âģ Ħ âĤ Ħ Ġis Ġlarger Ġthan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġoriginal ĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġdecoded Length Ġ= Ġchars . length . to Bid Dec () Ġ* Ġ 4 . to Bid Dec () Ġ/ Ġ 5 . to Bid Dec () ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( decoded Length . i ) ĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġchars ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠWh itespace Ġand Ġnew Ġlines Ġcharacters Ġmay Ġoccur Ġanywhere Ġto Ġac commod ate Ġline Ġlength Ġlimitations . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSo Ġlets Ġstrip Ġit . ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġ' Ġ' Ġ&& Ġit Ġ!= Ġ'\ n ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () Ġ Ġ// Ġ ĠSince ĠBase 8 5 Ġis Ġan Ġascii Ġencoder , Ġwe Ġdon 't Ġneed Ġto Ġget Ġthe Ġbytes Ġas ĠUTF - 8 . ĊĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= ĠByteArray ( 5 ) ĊĠĠĠĠĠĠĠ Ġvar Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( byte Ġin Ġpayload ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠBecause Ġall - zero Ġdata Ġis Ġquite Ġcommon , Ġan Ġexception Ġis Ġmade Ġfor Ġthe Ġsake Ġof Ġdata Ġcompression , Ġand Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall - zero Ġgroup Ġis Ġencoded Ġas Ġa Ġsingle Ġcharacter Ġ" z " Ġinstead Ġof Ġ" !!!! ! ". Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( byte Ġ== Ġ' z '. b ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ> Ġ 0 ) Ġthrow ĠIllegalArgumentException (" The Ġpayload Ġis Ġnot Ġbase Ġ 8 5 Ġencoded .") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġ'! '. b ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk [ chunk Index ++] Ġ= Ġbyte ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ== Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . put ( decode Chunk ( chunk )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . fill ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// If Ġwe Ġdidn 't Ġend Ġon Ġ 0 , Ġthen Ġwe Ġneed Ġsome Ġpadding ĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Index Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum P added Ġ= Ġchunk . size Ġ- Ġchunk Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . fill (' u '. b , Ġchunk Index , Ġchunk . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadded Decode Ġ= Ġdecode Chunk ( chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpadded Decode . size Ġ- Ġnum P added ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . put ( padded Decode [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuffer . flip () ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . array (). copyOf ( buffer . limit ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Chunk ( chunk : ĠByteArray ): ĠByteArray Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chunk . size Ġ!= Ġ 5 ) Ġthrow ĠIllegalArgumentException (" You Ġcan Ġonly Ġdecode Ġchunks Ġof Ġsize Ġ 5 .") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( 0 .. 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum Of Ġ{ Ġ( chunk [ it ] Ġ- ĠASCII _ SHIFT ) Ġ* ĠBASE 8 5 _ PO W [ 4 Ġ- Ġit ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. byteArray ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠByteArray . int : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ!= Ġ 4 ) Ġthrow ĠIllegalArgumentException (" You Ġcannot Ġcreate Ġan Ġint Ġwithout Ġexactly Ġ 4 Ġbytes .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠByteBuffer . wrap ( this ). int ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠInt . byteArray Ġget () Ġ= Ġbyte ArrayOf ( ush r ( 2 4 ). b , Ġ ush r ( 1 6 ). b , Ġ ush r ( 8 ). b , Ġb ) Ċ }