/* Ċ Ġ* ĠCopyright Ġ 2 0 1 1 ĠGoogle ĠInc . Ċ Ġ* ĠCopyright Ġ 2 0 1 4 ĠAnd reas ĠS child b ach Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠB ush ue v ĠD mit ri y Ġand ĠDash a ĠP ech kov sk aya Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Jvm Name (" Utils ") Ċ Ċ package Ġorg . echo . mobile . bitcoin j Ċ Ċ import Ġcom . google . common . base . Preconditions Ċ import Ġcom . google . common . io . Base Encoding Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . ByteBuffer Ċ Ċ /** Ċ Ġ* ĠA Ġcollection Ġof Ġvarious Ġutility Ġmethods Ġthat Ġare Ġhelpful Ġfor Ġworking Ġwith Ġthe ĠBitcoin Ġprotocol . Ċ Ġ* ĠTo Ġenable Ġdebug Ġlogging Ġfrom Ġthe Ġlibrary , Ġrun Ġwith Ġ- D bitcoin j . logging = true Ġon Ġyour Ġcommand Ġline . Ċ Ġ* Ċ Ġ* Ġ@ author ĠD aria ĠP ech kov sk aya Ċ Ġ*/ Ċ Ċ private Ġvar Ġis Android Ġ= Ġ- 1 Ċ val Ġis Android Runtime : ĠBoolean ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Android Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= ĠSystem . getProperty (" java . runtime . name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Android Ġ= Ġif Ġ( runtime Ġ!= Ġnull Ġ&& Ġruntime Ġ== Ġ" Android ĠRuntime ") Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Android Ġ== Ġ 1 ĊĠĠĠ Ġ} Ċ Ċ val ĠHEX : ĠBase Encoding Ġ= ĠBase Encoding . base 1 6 (). lower Case () Ċ Ċ /** Ċ Ġ* ĠThe Ġregular Ġ[ BigInteger . toByteArray ] Ġincludes Ġthe Ġsign Ġbit Ġof Ġthe Ġnumber Ġand Ċ Ġ* Ġmight Ġresult Ġin Ġan Ġextra Ġbyte Ġaddition . ĠThis Ġmethod Ġremoves Ġthis Ġextra Ġbyte . Ċ Ġ* Ċ Ġ* ĠAss uming Ġonly Ġpositive Ġnumbers , Ġit 's Ġpossible Ġto Ġdis crimin ate Ġif Ġan Ġextra Ġbyte Ċ Ġ* Ġis Ġadded Ġby Ġchecking Ġif Ġthe Ġfirst Ġelement Ġof Ġthe Ġarray Ġis Ġ 0 Ġ( 0 0 0 0 _ 0 0 0 0 ). Ċ Ġ* ĠDue Ġto Ġthe Ġminimal Ġrepresentation Ġprovided Ġby ĠBigInteger , Ġit Ġmeans Ġthat Ġthe Ġbit Ġsign Ċ Ġ* Ġis Ġthe Ġleast Ġsignificant Ġbit Ġ 0 0 0 0 _ 0 0 0 ** 0 ** Ġ. Ċ Ġ* ĠOtherwise Ġthe Ġrepresentation Ġis Ġnot Ġminimal . Ċ Ġ* ĠFor Ġexample , Ġif Ġthe Ġsign Ġbit Ġis Ġ 0 0 0 0 _ 0 0 ** 0 ** 0 , Ġthen Ġthe Ġrepresentation Ġis Ġnot Ġminimal Ġdue Ġto Ġthe Ġright most Ġzero . Ċ Ġ* Ċ Ġ* Ġ@ param Ġnum Bytes Ġthe Ġdesired Ġsize Ġof Ġthe Ġresulting Ġbyte Ġarray Ċ Ġ*/ Ċ fun ĠBigInteger . big Integer ToBytes ( num Bytes : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠ ĠPreconditions . check Argument ( this . sign um () Ġ>= Ġ 0 , Ġ" b Ġmust Ġbe Ġpositive Ġor Ġzero ") ĊĠĠĠ ĠPreconditions . check Argument ( num Bytes Ġ> Ġ 0 , Ġ" num Bytes Ġmust Ġbe Ġpositive ") ĊĠĠĠ Ġval Ġsrc Ġ= Ġthis . toByteArray () ĊĠĠĠ Ġval Ġdest Ġ= ĠByteArray ( num Bytes ) ĊĠĠĠ Ġval Ġis First Byte Only For Sign Ġ= Ġsrc [ 0 ]. toInt () Ġ== Ġ 0 ĊĠĠĠ Ġval Ġlength Ġ= Ġif Ġ( is First Byte Only For Sign ) Ġsrc . size Ġ- Ġ 1 Ġelse Ġsrc . size ĊĠĠĠ ĠPreconditions . check Argument ( ĊĠĠĠĠĠĠĠ Ġlength Ġ<= Ġnum Bytes , ĊĠĠĠĠĠĠĠ Ġ" The Ġgiven Ġnumber Ġdoes Ġnot Ġfit Ġin Ġ$ num Bytes " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġsrc Pos Ġ= Ġif Ġ( is First Byte Only For Sign ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġval Ġdest Pos Ġ= Ġnum Bytes Ġ- Ġlength ĊĠĠĠ ĠSystem . arraycopy ( src , Ġsrc Pos , Ġdest , Ġdest Pos , Ġlength ) ĊĠĠĠ Ġreturn Ġdest Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġcopy Ġof Ġthe Ġgiven Ġbyte Ġarray Ġin Ġreverse Ġorder . Ċ Ġ*/ Ċ fun ĠByteArray . reverse Bytes (): ĠByteArray Ġ{ ĊĠĠĠ Ġ// ĠWe Ġcould Ġuse Ġthe ĠXOR Ġtrick Ġhere Ġbut Ġit 's Ġeasier Ġto Ġunderstand Ġif Ġwe Ġdon 't . ĠIf Ġwe Ġfind Ġthis Ġis Ġreally Ġa ĊĠĠĠ Ġ// Ġperformance Ġissue Ġthe Ġmatter Ġcan Ġbe Ġre visited . ĊĠĠĠ Ġval Ġbuf Ġ= ĠByteArray ( this . size ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġthis . indices ) ĊĠĠĠĠĠĠĠ Ġbuf [ i ] Ġ= Ġthis [ this . size Ġ- Ġ 1 Ġ- Ġi ] ĊĠĠĠ Ġreturn Ġbuf Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġarray Ġof Ġbytes Ġwith Ġthe Ġunderlying Ġdata Ġused Ġto Ġrepresent Ġan Ġinteger Ġin Ġthe Ġreverse Ġform . Ċ Ġ* ĠThis Ġis Ġuseful Ġfor Ġendian ess Ġswitches , Ġmeaning Ġthat Ġif Ġyou Ġgive Ġthis Ġfunction Ġa Ġbig - endian Ġinteger Ċ Ġ* Ġit Ġwill Ġreturn Ġit 's Ġlittle - endian Ġbytes . Ċ Ġ* Ġ@ param Ġinput ĠAn ĠInteger Ġvalue . Ċ Ġ* Ġ@ return ĠThe Ġarray Ġof Ġbytes Ġthat Ġrepresent Ġthis Ġvalue Ġin Ġthe Ġreverse Ġformat . Ċ Ġ*/ Ċ fun ĠInt . revert (): ĠByteArray Ġ= ĊĠĠĠ ĠByteBuffer . allocate ( Integer . SIZE Ġ/ Ġ 8 ). put Int ( Integer . reverse Bytes ( this )). array () Ċ Ċ /** Ċ Ġ* ĠSame Ġoperation Ġas Ġin Ġthe Ġrevert Integer Ġfunction , Ġbut Ġin Ġthis Ġcase Ġfor Ġa Ġshort Ġ( 2 Ġbytes ) Ġvalue . Ċ Ġ* Ġ@ param Ġinput ĠA ĠShort Ġvalue Ċ Ġ* Ġ@ return ĠThe Ġarray Ġof Ġbytes Ġthat Ġrepresent Ġthis Ġvalue Ġin Ġthe Ġreverse Ġformat . Ċ Ġ*/ Ċ fun ĠShort . revert (): ĠByteArray Ġ= ĊĠĠĠ ĠByteBuffer . allocate ( java . lang . Short . SIZE Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġ. put Short ( java . lang . Short . reverse Bytes ( this )). array () ĊĊ Ċ /** Ċ Ġ* ĠSame Ġoperation Ġas Ġin Ġthe Ġrevert Integer Ġfunction , Ġbut Ġin Ġthis Ġcase Ġfor Ġa Ġlong Ġ( 8 Ġbytes ) Ġvalue . Ċ Ġ* Ġ@ param Ġinput ĠA ĠLong Ġvalue Ċ Ġ* Ġ@ return ĠThe Ġarray Ġof Ġbytes Ġthat Ġrepresent Ġthis Ġvalue Ġin Ġthe Ġreverse Ġformat . Ċ Ġ*/ Ċ fun ĠLong . revert (): ĠByteArray Ġ= ĊĠĠĠ ĠByteBuffer . allocate ( java . lang . Long . SIZE Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġ. put Long ( java . lang . Long . reverse Bytes ( this )). array () Ċ