11package com .github .fluency03 .multibase
22
3+
34sealed abstract class Base (
45 val name : String ,
56 val code : Char ,
6- val alphabet : String ,
7- val pad : Option [Char ]) {
7+ val alphabet : String ) {
88
99 lazy val alphabetPos : Map [Char , Int ] = (for (i <- alphabet.indices) yield alphabet(i) -> i).toMap
1010
@@ -14,49 +14,82 @@ sealed class Base16RFC4648(
1414 override val name : String ,
1515 override val code : Char ,
1616 override val alphabet : String ,
17- override val pad : Option [Char ])
18- extends Base (name, code, alphabet, pad )
17+ val pad : Option [Char ])
18+ extends Base (name, code, alphabet)
1919
2020sealed class Base32RFC4648 (
2121 override val name : String ,
2222 override val code : Char ,
2323 override val alphabet : String ,
24- override val pad : Option [Char ])
25- extends Base (name, code, alphabet, pad )
24+ val pad : Option [Char ])
25+ extends Base (name, code, alphabet)
2626
2727sealed class Base64RFC4648 (
2828 override val name : String ,
2929 override val code : Char ,
3030 override val alphabet : String ,
31- override val pad : Option [Char ])
32- extends Base (name, code, alphabet, pad )
31+ val pad : Option [Char ])
32+ extends Base (name, code, alphabet)
3333
3434
3535object Base {
36- case object Identity extends Base (" identity" , 0x00 , " " , None )
37- case object Base1 extends Base (" base1" , '1' , " 1" , None )
38- case object Base2 extends Base (" base2" , '0' , " 01" , None )
39- case object Base8 extends Base (" base8" , '7' , " 01234567" , None )
40- case object Base10 extends Base (" base10" , '9' , " 0123456789" , None )
36+
37+ /**
38+ * Reference: https://github.com/multiformats/multibase/blob/master/multibase.csv
39+ * encoding codes name
40+ *
41+ * identity 0x00 8-bit binary (encoder and decoder keeps data unmodified)
42+ * base1 1 unary tends to be 11111
43+ * base2 0 binary has 1 and 0
44+ * base8 7 highest char in octal
45+ * base10 9 highest char in decimal
46+ * base16 F, f highest char in hex
47+ * base32 B, b rfc4648 - no padding - highest letter
48+ * base32pad C, c rfc4648 - with padding
49+ * base32hex V, v rfc4648 - no padding - highest char
50+ * base32hexpad T, t rfc4648 - with padding
51+ * base32z h z-base-32 - used by Tahoe-LAFS - highest letter
52+ * base58flickr Z highest char
53+ * base58btc z highest char
54+ * base64 m rfc4648 - no padding
55+ * base64pad M rfc4648 - with padding - MIME encoding
56+ * base64url u rfc4648 - no padding
57+ * base64urlpad U rfc4648 - with padding
58+ */
59+
60+ case object Identity extends Base (" identity" , 0x00 , " " )
61+ case object Base1 extends Base (" base1" , '1' , " 1" )
62+ case object Base2 extends Base (" base2" , '0' , " 01" )
63+ case object Base8 extends Base (" base8" , '7' , " 01234567" )
64+ case object Base10 extends Base (" base10" , '9' , " 0123456789" )
65+
4166 case object Base16 extends Base16RFC4648 (" base16" , 'f' , " 0123456789abcdef" , None )
4267 case object Base16Upper extends Base16RFC4648 (" base16upper" , 'F' , " 0123456789ABCDEF" , None )
68+
4369 case object Base32 extends Base32RFC4648 (" base32" , 'b' , " abcdefghijklmnopqrstuvwxyz234567" , None )
4470 case object Base32Upper extends Base32RFC4648 (" base32upper" , 'B' , " ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" , None )
4571 case object Base32Pad extends Base32RFC4648 (" base32pad" , 'c' , " abcdefghijklmnopqrstuvwxyz234567" , Some ('=' ))
4672 case object Base32PadUpper extends Base32RFC4648 (" base32padupper" , 'C' , " ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" , Some ('=' ))
73+
4774 case object Base32Hex extends Base32RFC4648 (" base32hex" , 'v' , " 0123456789abcdefghijklmnopqrstuv" , None )
4875 case object Base32HexUpper extends Base32RFC4648 (" base32hexupper" , 'V' , " 0123456789ABCDEFGHIJKLMNOPQRSTUV" , None )
4976 case object Base32HexPad extends Base32RFC4648 (" base32hexpad" , 't' , " 0123456789abcdefghijklmnopqrstuv" , Some ('=' ))
5077 case object Base32HexPadUpper extends Base32RFC4648 (" base32hexpadupper" , 'T' , " 0123456789ABCDEFGHIJKLMNOPQRSTUV" , Some ('=' ))
51- case object Base32Z extends Base (" base32z" , 'h' , " ybndrfg8ejkmcpqxot1uwisza345h769" , None )
52- case object Base58Flickr extends Base (" base58flickr" , 'Z' , " 123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" , None )
53- case object Base58BTC extends Base (" base58btc" , 'z' , " 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" , None )
78+
79+ case object Base32Z extends Base (" base32z" , 'h' , " ybndrfg8ejkmcpqxot1uwisza345h769" )
80+ case object Base58Flickr extends Base (" base58flickr" , 'Z' , " 123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" )
81+ case object Base58BTC extends Base (" base58btc" , 'z' , " 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" )
82+
5483 case object Base64 extends Base64RFC4648 (" base64" , 'm' , " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" , None )
5584 case object Base64Pad extends Base64RFC4648 (" base64pad" , 'M' , " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" , Some ('=' ))
5685 case object Base64URL extends Base64RFC4648 (" base64url" , 'u' , " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" , None )
5786 case object Base64URLPad extends Base64RFC4648 (" base64urlpad" , 'U' , " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" , Some ('=' ))
5887
59- lazy val codes : Map [Char , Base ] = Map (
88+
89+ /**
90+ * Mappings from Base Code -> Base
91+ */
92+ lazy val Codes : Map [Char , Base ] = Map (
6093 Identity .code -> Identity ,
6194 Base1 .code -> Base1 ,
6295 Base2 .code -> Base2 ,
@@ -78,10 +111,13 @@ object Base {
78111 Base64 .code -> Base64 ,
79112 Base64Pad .code -> Base64Pad ,
80113 Base64URL .code -> Base64URL ,
81- Base64URLPad .code -> Base64URLPad
82- )
114+ Base64URLPad .code -> Base64URLPad )
83115
84- lazy val names : Map [String , Base ] = Map (
116+
117+ /**
118+ * Mappings from Base Name -> Base
119+ */
120+ lazy val Names : Map [String , Base ] = Map (
85121 Identity .name -> Identity ,
86122 Base1 .name -> Base1 ,
87123 Base2 .name -> Base2 ,
@@ -103,9 +139,12 @@ object Base {
103139 Base64 .name -> Base64 ,
104140 Base64Pad .name -> Base64Pad ,
105141 Base64URL .name -> Base64URL ,
106- Base64URLPad .name -> Base64URLPad
107- )
142+ Base64URLPad .name -> Base64URLPad )
143+
108144
109- lazy val unsupported : Map [Char , Base ] = Map (Base1 .code -> Base1 )
145+ /**
146+ * Unsupported Base.
147+ */
148+ lazy val Unsupported : Map [Char , Base ] = Map (Base1 .code -> Base1 )
110149
111150}
0 commit comments