Skip to content

Commit 63c0d34

Browse files
committed
Improve encoding and decoding
1 parent d500c94 commit 63c0d34

File tree

1 file changed

+108
-48
lines changed

1 file changed

+108
-48
lines changed

src/Multibase.php

Lines changed: 108 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -37,148 +37,208 @@ class Multibase{
3737
private const ALPHABET58_BITCOIN = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
3838
private const ALPHABET58_FLICKR = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
3939

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){
4452
case self::IDENTITY:{
45-
return $rest;
53+
$decoded = $data;
54+
break;
4655
}
4756
case self::BASE2:{
48-
return Base2::decode($rest);
57+
$decoded = Base2::decode($data);
58+
break;
4959
}
5060
case self::BASE8:{
51-
return Base8::decode($rest);
61+
$decoded = Base8::decode($data);
62+
break;
5263
}
5364
case self::BASE10:{
54-
return Base10::decode($rest);
65+
$decoded = Base10::decode($data);
66+
break;
5567
}
5668
case self::BASE16:{
57-
return Base16::decode($rest);
69+
$decoded = Base16::decode($data);
70+
break;
5871
}
5972
case self::BASE16UPPER:{
60-
return Base16::decode(strtolower($rest));
73+
$decoded = Base16::decode(strtolower($data));
74+
break;
6175
}
6276
case self::BASE32HEX:
6377
case self::BASE32HEXPAD:{
64-
return Base32::decode($rest,self::ALPHABET32_HEX);
78+
$decoded = Base32::decode($data,self::ALPHABET32_HEX);
79+
break;
6580
}
6681
case self::BASE32HEXUPPER:
6782
case self::BASE32HEXPADUPPER:{
68-
return Base32::decode(strtolower($rest),self::ALPHABET32_HEX);
83+
$decoded = Base32::decode(strtolower($data),self::ALPHABET32_HEX);
84+
break;
6985
}
7086
case self::BASE32:
7187
case self::BASE32PAD:{
72-
return Base32::decode($rest,self::ALPHABET32);
88+
$decoded = Base32::decode($data,self::ALPHABET32);
89+
break;
7390
}
7491
case self::BASE32UPPER:
7592
case self::BASE32PADUPPER:{
76-
return Base32::decode(strtolower($rest),self::ALPHABET32);
93+
$decoded = Base32::decode(strtolower($data),self::ALPHABET32);
94+
break;
7795
}
7896
case self::BASE32Z:{
79-
return Base32::decode($rest,self::ALPHABET32_ZOOKO);
97+
$decoded = Base32::decode($data,self::ALPHABET32_ZOOKO);
98+
break;
8099
}
81100
case self::BASE36:{
82-
return Base36::decode($rest);
101+
$decoded = Base36::decode($data);
102+
break;
83103
}
84104
case self::BASE36UPPER:{
85-
return Base36::decode(strtolower($rest));
105+
$decoded = Base36::decode(strtolower($data));
106+
break;
86107
}
87108
case self::BASE58BTC:{
88-
return Base58::decode($rest,self::ALPHABET58_BITCOIN);
109+
$decoded = Base58::decode($data,self::ALPHABET58_BITCOIN);
110+
break;
89111
}
90112
case self::BASE58FLICKR:{
91-
return Base58::decode($rest,self::ALPHABET58_FLICKR);
113+
$decoded = Base58::decode($data,self::ALPHABET58_FLICKR);
114+
break;
92115
}
93116
case self::BASE64:
94117
case self::BASE64PAD:{
95-
return Base64::decode($rest);
118+
$decoded = Base64::decode($data);
119+
break;
96120
}
97121
case self::BASE64URL:
98122
case self::BASE64URLPAD:{
99-
return Base64::decode(str_replace(['-','_'],['+','/'],$rest));
123+
$decoded = Base64::decode(str_replace(['-','_'],['+','/'],$data));
124+
break;
100125
}
101126
default:{
102-
throw new InvalidArgumentException('Unsupported base decoding: '.$b);
127+
throw new InvalidArgumentException('Unsupported base decoding: '.$code);
103128
}
104129
}
130+
return $decoded;
105131
}
106132

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){
109142
case self::IDENTITY:{
110-
return $b.$data;
143+
$encoded = $data;
144+
break;
111145
}
112146
case self::BASE2:{
113-
return $b.Base2::encode($data);
147+
$encoded = Base2::encode($data);
148+
break;
114149
}
115150
case self::BASE8:{
116-
return $b.Base8::encode($data);
151+
$encoded = Base8::encode($data);
152+
break;
117153
}
118154
case self::BASE10:{
119-
return $b.Base10::encode($data);
155+
$encoded = Base10::encode($data);
156+
break;
120157
}
121158
case self::BASE16:{
122-
return $b.Base16::encode($data);
159+
$encoded = Base16::encode($data);
160+
break;
123161
}
124162
case self::BASE16UPPER:{
125-
return $b.strtoupper(Base16::encode($data));
163+
$encoded = strtoupper(Base16::encode($data));
164+
break;
126165
}
127166
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;
129169
}
130170
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;
132173
}
133174
case self::BASE32HEXPAD:{
134-
return $b.Base32::encode($data,self::ALPHABET32_HEX);
175+
$encoded = Base32::encode($data,self::ALPHABET32_HEX);
176+
break;
135177
}
136178
case self::BASE32HEXPADUPPER:{
137-
return $b.strtoupper(Base32::encode($data,self::ALPHABET32_HEX));
179+
$encoded = strtoupper(Base32::encode($data,self::ALPHABET32_HEX));
180+
break;
138181
}
139182
case self::BASE32:{
140-
return $b.str_replace('=','',Base32::encode($data,self::ALPHABET32));
183+
$encoded = str_replace('=','',Base32::encode($data,self::ALPHABET32));
184+
break;
141185
}
142186
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;
144189
}
145190
case self::BASE32PAD:{
146-
return $b.Base32::encode($data,self::ALPHABET32);
191+
$encoded = Base32::encode($data,self::ALPHABET32);
192+
break;
147193
}
148194
case self::BASE32PADUPPER:{
149-
return $b.strtoupper(Base32::encode($data,self::ALPHABET32));
195+
$encoded = strtoupper(Base32::encode($data,self::ALPHABET32));
196+
break;
150197
}
151198
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;
153201
}
154202
case self::BASE36:{
155-
return $b.Base36::encode($data);
203+
$encoded = Base36::encode($data);
204+
break;
156205
}
157206
case self::BASE36UPPER:{
158-
return $b.strtoupper(Base36::encode($data));
207+
$encoded = strtoupper(Base36::encode($data));
208+
break;
159209
}
160210
case self::BASE58BTC:{
161-
return $b.Base58::encode($data,self::ALPHABET58_BITCOIN);
211+
$encoded = Base58::encode($data,self::ALPHABET58_BITCOIN);
212+
break;
162213
}
163214
case self::BASE58FLICKR:{
164-
return $b.Base58::encode($data,self::ALPHABET58_FLICKR);
215+
$encoded = Base58::encode($data,self::ALPHABET58_FLICKR);
216+
break;
165217
}
166218
case self::BASE64:{
167-
return $b.str_replace('=','',Base64::encode($data));
219+
$encoded = str_replace('=','',Base64::encode($data));
220+
break;
168221
}
169222
case self::BASE64PAD:{
170-
return $b.Base64::encode($data);
223+
$encoded = Base64::encode($data);
224+
break;
171225
}
172226
case self::BASE64URL:{
173-
return $b.str_replace('=','',str_replace(['+','/'],['-','_'],Base64::encode($data)));
227+
$encoded = str_replace('=','',str_replace(['+','/'],['-','_'],Base64::encode($data)));
228+
break;
174229
}
175230
case self::BASE64URLPAD:{
176-
return $b.str_replace(['+','/'],['-','_'],Base64::encode($data));
231+
$encoded = str_replace(['+','/'],['-','_'],Base64::encode($data));
232+
break;
177233
}
178234
default:{
179-
throw new InvalidArgumentException('Unsupported base encoding: '.$b);
235+
throw new InvalidArgumentException('Unsupported base encoding: '.$code);
180236
}
181237
}
238+
if($addCodePrefix){
239+
$encoded = $code.$encoded;
240+
}
241+
return $encoded;
182242
}
183243

184244
}

0 commit comments

Comments
 (0)