@@ -37,148 +37,208 @@ class Multibase{
37
37
private const ALPHABET58_BITCOIN = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz ' ;
38
38
private const ALPHABET58_FLICKR = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ ' ;
39
39
40
- public static function decode (string $ data ): string {
41
- $ b = substr ($ data ,0 ,1 );
42
- $ rest = substr ($ data ,1 );
43
- switch ($ b ){
40
+ /**
41
+ * @param string $data
42
+ * @param string|null $code
43
+ * @return string
44
+ */
45
+ public static function decode (string $ data ,?string $ code =null ): string {
46
+ $ decoded = null ;
47
+ if ($ code ==null ){
48
+ $ code = substr ($ data ,0 ,1 );
49
+ $ data = substr ($ data ,1 );
50
+ }
51
+ switch ($ code ){
44
52
case self ::IDENTITY :{
45
- return $ rest ;
53
+ $ decoded = $ data ;
54
+ break ;
46
55
}
47
56
case self ::BASE2 :{
48
- return Base2::decode ($ rest );
57
+ $ decoded = Base2::decode ($ data );
58
+ break ;
49
59
}
50
60
case self ::BASE8 :{
51
- return Base8::decode ($ rest );
61
+ $ decoded = Base8::decode ($ data );
62
+ break ;
52
63
}
53
64
case self ::BASE10 :{
54
- return Base10::decode ($ rest );
65
+ $ decoded = Base10::decode ($ data );
66
+ break ;
55
67
}
56
68
case self ::BASE16 :{
57
- return Base16::decode ($ rest );
69
+ $ decoded = Base16::decode ($ data );
70
+ break ;
58
71
}
59
72
case self ::BASE16UPPER :{
60
- return Base16::decode (strtolower ($ rest ));
73
+ $ decoded = Base16::decode (strtolower ($ data ));
74
+ break ;
61
75
}
62
76
case self ::BASE32HEX :
63
77
case self ::BASE32HEXPAD :{
64
- return Base32::decode ($ rest ,self ::ALPHABET32_HEX );
78
+ $ decoded = Base32::decode ($ data ,self ::ALPHABET32_HEX );
79
+ break ;
65
80
}
66
81
case self ::BASE32HEXUPPER :
67
82
case self ::BASE32HEXPADUPPER :{
68
- return Base32::decode (strtolower ($ rest ),self ::ALPHABET32_HEX );
83
+ $ decoded = Base32::decode (strtolower ($ data ),self ::ALPHABET32_HEX );
84
+ break ;
69
85
}
70
86
case self ::BASE32 :
71
87
case self ::BASE32PAD :{
72
- return Base32::decode ($ rest ,self ::ALPHABET32 );
88
+ $ decoded = Base32::decode ($ data ,self ::ALPHABET32 );
89
+ break ;
73
90
}
74
91
case self ::BASE32UPPER :
75
92
case self ::BASE32PADUPPER :{
76
- return Base32::decode (strtolower ($ rest ),self ::ALPHABET32 );
93
+ $ decoded = Base32::decode (strtolower ($ data ),self ::ALPHABET32 );
94
+ break ;
77
95
}
78
96
case self ::BASE32Z :{
79
- return Base32::decode ($ rest ,self ::ALPHABET32_ZOOKO );
97
+ $ decoded = Base32::decode ($ data ,self ::ALPHABET32_ZOOKO );
98
+ break ;
80
99
}
81
100
case self ::BASE36 :{
82
- return Base36::decode ($ rest );
101
+ $ decoded = Base36::decode ($ data );
102
+ break ;
83
103
}
84
104
case self ::BASE36UPPER :{
85
- return Base36::decode (strtolower ($ rest ));
105
+ $ decoded = Base36::decode (strtolower ($ data ));
106
+ break ;
86
107
}
87
108
case self ::BASE58BTC :{
88
- return Base58::decode ($ rest ,self ::ALPHABET58_BITCOIN );
109
+ $ decoded = Base58::decode ($ data ,self ::ALPHABET58_BITCOIN );
110
+ break ;
89
111
}
90
112
case self ::BASE58FLICKR :{
91
- return Base58::decode ($ rest ,self ::ALPHABET58_FLICKR );
113
+ $ decoded = Base58::decode ($ data ,self ::ALPHABET58_FLICKR );
114
+ break ;
92
115
}
93
116
case self ::BASE64 :
94
117
case self ::BASE64PAD :{
95
- return Base64::decode ($ rest );
118
+ $ decoded = Base64::decode ($ data );
119
+ break ;
96
120
}
97
121
case self ::BASE64URL :
98
122
case self ::BASE64URLPAD :{
99
- return Base64::decode (str_replace (['- ' ,'_ ' ],['+ ' ,'/ ' ],$ rest ));
123
+ $ decoded = Base64::decode (str_replace (['- ' ,'_ ' ],['+ ' ,'/ ' ],$ data ));
124
+ break ;
100
125
}
101
126
default :{
102
- throw new InvalidArgumentException ('Unsupported base decoding: ' .$ b );
127
+ throw new InvalidArgumentException ('Unsupported base decoding: ' .$ code );
103
128
}
104
129
}
130
+ return $ decoded ;
105
131
}
106
132
107
- public static function encode (string $ b ,string $ data ){
108
- switch ($ b ){
133
+ /**
134
+ * @param string $code
135
+ * @param string $data
136
+ * @param bool $addCodePrefix
137
+ * @return string|null
138
+ */
139
+ public static function encode (string $ code ,string $ data ,$ addCodePrefix =true ){
140
+ $ encoded = null ;
141
+ switch ($ code ){
109
142
case self ::IDENTITY :{
110
- return $ b .$ data ;
143
+ $ encoded = $ data ;
144
+ break ;
111
145
}
112
146
case self ::BASE2 :{
113
- return $ b .Base2::encode ($ data );
147
+ $ encoded = Base2::encode ($ data );
148
+ break ;
114
149
}
115
150
case self ::BASE8 :{
116
- return $ b .Base8::encode ($ data );
151
+ $ encoded = Base8::encode ($ data );
152
+ break ;
117
153
}
118
154
case self ::BASE10 :{
119
- return $ b .Base10::encode ($ data );
155
+ $ encoded = Base10::encode ($ data );
156
+ break ;
120
157
}
121
158
case self ::BASE16 :{
122
- return $ b .Base16::encode ($ data );
159
+ $ encoded = Base16::encode ($ data );
160
+ break ;
123
161
}
124
162
case self ::BASE16UPPER :{
125
- return $ b .strtoupper (Base16::encode ($ data ));
163
+ $ encoded = strtoupper (Base16::encode ($ data ));
164
+ break ;
126
165
}
127
166
case self ::BASE32HEX :{
128
- return $ b .str_replace ('= ' ,'' ,Base32::encode ($ data ,self ::ALPHABET32_HEX ));
167
+ $ encoded = str_replace ('= ' ,'' ,Base32::encode ($ data ,self ::ALPHABET32_HEX ));
168
+ break ;
129
169
}
130
170
case self ::BASE32HEXUPPER :{
131
- return $ b .str_replace ('= ' ,'' ,strtoupper (Base32::encode ($ data ,self ::ALPHABET32_HEX )));
171
+ $ encoded = str_replace ('= ' ,'' ,strtoupper (Base32::encode ($ data ,self ::ALPHABET32_HEX )));
172
+ break ;
132
173
}
133
174
case self ::BASE32HEXPAD :{
134
- return $ b .Base32::encode ($ data ,self ::ALPHABET32_HEX );
175
+ $ encoded = Base32::encode ($ data ,self ::ALPHABET32_HEX );
176
+ break ;
135
177
}
136
178
case self ::BASE32HEXPADUPPER :{
137
- return $ b .strtoupper (Base32::encode ($ data ,self ::ALPHABET32_HEX ));
179
+ $ encoded = strtoupper (Base32::encode ($ data ,self ::ALPHABET32_HEX ));
180
+ break ;
138
181
}
139
182
case self ::BASE32 :{
140
- return $ b .str_replace ('= ' ,'' ,Base32::encode ($ data ,self ::ALPHABET32 ));
183
+ $ encoded = str_replace ('= ' ,'' ,Base32::encode ($ data ,self ::ALPHABET32 ));
184
+ break ;
141
185
}
142
186
case self ::BASE32UPPER :{
143
- return $ b .str_replace ('= ' ,'' ,strtoupper (Base32::encode ($ data ,self ::ALPHABET32 )));
187
+ $ encoded = str_replace ('= ' ,'' ,strtoupper (Base32::encode ($ data ,self ::ALPHABET32 )));
188
+ break ;
144
189
}
145
190
case self ::BASE32PAD :{
146
- return $ b .Base32::encode ($ data ,self ::ALPHABET32 );
191
+ $ encoded = Base32::encode ($ data ,self ::ALPHABET32 );
192
+ break ;
147
193
}
148
194
case self ::BASE32PADUPPER :{
149
- return $ b .strtoupper (Base32::encode ($ data ,self ::ALPHABET32 ));
195
+ $ encoded = strtoupper (Base32::encode ($ data ,self ::ALPHABET32 ));
196
+ break ;
150
197
}
151
198
case self ::BASE32Z :{
152
- return $ b .str_replace ('= ' ,'' ,Base32::encode ($ data ,self ::ALPHABET32_ZOOKO ));
199
+ $ encoded = str_replace ('= ' ,'' ,Base32::encode ($ data ,self ::ALPHABET32_ZOOKO ));
200
+ break ;
153
201
}
154
202
case self ::BASE36 :{
155
- return $ b .Base36::encode ($ data );
203
+ $ encoded = Base36::encode ($ data );
204
+ break ;
156
205
}
157
206
case self ::BASE36UPPER :{
158
- return $ b .strtoupper (Base36::encode ($ data ));
207
+ $ encoded = strtoupper (Base36::encode ($ data ));
208
+ break ;
159
209
}
160
210
case self ::BASE58BTC :{
161
- return $ b .Base58::encode ($ data ,self ::ALPHABET58_BITCOIN );
211
+ $ encoded = Base58::encode ($ data ,self ::ALPHABET58_BITCOIN );
212
+ break ;
162
213
}
163
214
case self ::BASE58FLICKR :{
164
- return $ b .Base58::encode ($ data ,self ::ALPHABET58_FLICKR );
215
+ $ encoded = Base58::encode ($ data ,self ::ALPHABET58_FLICKR );
216
+ break ;
165
217
}
166
218
case self ::BASE64 :{
167
- return $ b .str_replace ('= ' ,'' ,Base64::encode ($ data ));
219
+ $ encoded = str_replace ('= ' ,'' ,Base64::encode ($ data ));
220
+ break ;
168
221
}
169
222
case self ::BASE64PAD :{
170
- return $ b .Base64::encode ($ data );
223
+ $ encoded = Base64::encode ($ data );
224
+ break ;
171
225
}
172
226
case self ::BASE64URL :{
173
- return $ b .str_replace ('= ' ,'' ,str_replace (['+ ' ,'/ ' ],['- ' ,'_ ' ],Base64::encode ($ data )));
227
+ $ encoded = str_replace ('= ' ,'' ,str_replace (['+ ' ,'/ ' ],['- ' ,'_ ' ],Base64::encode ($ data )));
228
+ break ;
174
229
}
175
230
case self ::BASE64URLPAD :{
176
- return $ b .str_replace (['+ ' ,'/ ' ],['- ' ,'_ ' ],Base64::encode ($ data ));
231
+ $ encoded = str_replace (['+ ' ,'/ ' ],['- ' ,'_ ' ],Base64::encode ($ data ));
232
+ break ;
177
233
}
178
234
default :{
179
- throw new InvalidArgumentException ('Unsupported base encoding: ' .$ b );
235
+ throw new InvalidArgumentException ('Unsupported base encoding: ' .$ code );
180
236
}
181
237
}
238
+ if ($ addCodePrefix ){
239
+ $ encoded = $ code .$ encoded ;
240
+ }
241
+ return $ encoded ;
182
242
}
183
243
184
244
}
0 commit comments