2
2
3
3
namespace TinyBlocks \Encoder ;
4
4
5
+ use TinyBlocks \Encoder \Internal \Exceptions \InvalidBase62Encoding ;
6
+
5
7
final class Base62
6
8
{
7
9
private const BASE62_RADIX = 62 ;
8
10
private const BASE62_ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ' ;
9
- private const HEXADECIMAL_RADIX = 16 ;
11
+ private const BASE62_HEXADECIMAL_RADIX = 16 ;
10
12
11
13
public static function encode (string $ value ): string
12
14
{
@@ -21,16 +23,20 @@ public static function encode(string $value): string
21
23
$ base62 = str_repeat (self ::BASE62_ALPHABET [0 ], $ bytes );
22
24
23
25
if (empty ($ hexadecimal )) {
24
- return strtr ( $ base62, self :: BASE62_ALPHABET , self :: BASE62_ALPHABET ) ;
26
+ return $ base62 ;
25
27
}
26
28
27
- $ base62Conversion = gmp_strval ( gmp_init ($ hexadecimal , self ::HEXADECIMAL_RADIX ), self :: BASE62_RADIX );
29
+ $ number = gmp_init ($ hexadecimal , self ::BASE62_HEXADECIMAL_RADIX );
28
30
29
- return strtr ( $ base62 . $ base62Conversion , self ::BASE62_ALPHABET , self :: BASE62_ALPHABET );
31
+ return $ base62 . gmp_strval ( $ number , self ::BASE62_RADIX );
30
32
}
31
33
32
34
public static function decode (string $ value ): string
33
35
{
36
+ if (strlen ($ value ) !== strspn ($ value , self ::BASE62_ALPHABET )) {
37
+ throw new InvalidBase62Encoding (value: $ value );
38
+ }
39
+
34
40
$ bytes = 0 ;
35
41
36
42
while (!empty ($ value ) && str_starts_with ($ value , self ::BASE62_ALPHABET [0 ])) {
@@ -42,9 +48,10 @@ public static function decode(string $value): string
42
48
return str_repeat ("\x00" , $ bytes );
43
49
}
44
50
45
- $ hexadecimal = gmp_strval (gmp_init ($ value , self ::BASE62_RADIX ), self ::HEXADECIMAL_RADIX );
51
+ $ number = gmp_init ($ value , self ::BASE62_RADIX );
52
+ $ hexadecimal = gmp_strval ($ number , self ::BASE62_HEXADECIMAL_RADIX );
46
53
47
- if (strlen ($ hexadecimal ) % 2 !== 0 ) {
54
+ if (strlen ($ hexadecimal ) % 2 ) {
48
55
$ hexadecimal = '0 ' . $ hexadecimal ;
49
56
}
50
57
0 commit comments