22
33namespace TinyBlocks \Encoder ;
44
5+ use TinyBlocks \Encoder \Internal \Exceptions \InvalidBase62Encoding ;
6+
57final class Base62
68{
79 private const BASE62_RADIX = 62 ;
810 private const BASE62_ALPHABET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ' ;
9- private const HEXADECIMAL_RADIX = 16 ;
11+ private const BASE62_HEXADECIMAL_RADIX = 16 ;
1012
1113 public static function encode (string $ value ): string
1214 {
@@ -21,16 +23,20 @@ public static function encode(string $value): string
2123 $ base62 = str_repeat (self ::BASE62_ALPHABET [0 ], $ bytes );
2224
2325 if (empty ($ hexadecimal )) {
24- return strtr ( $ base62, self :: BASE62_ALPHABET , self :: BASE62_ALPHABET ) ;
26+ return $ base62 ;
2527 }
2628
27- $ base62Conversion = gmp_strval ( gmp_init ($ hexadecimal , self ::HEXADECIMAL_RADIX ), self :: BASE62_RADIX );
29+ $ number = gmp_init ($ hexadecimal , self ::BASE62_HEXADECIMAL_RADIX );
2830
29- return strtr ( $ base62 . $ base62Conversion , self ::BASE62_ALPHABET , self :: BASE62_ALPHABET );
31+ return $ base62 . gmp_strval ( $ number , self ::BASE62_RADIX );
3032 }
3133
3234 public static function decode (string $ value ): string
3335 {
36+ if (strlen ($ value ) !== strspn ($ value , self ::BASE62_ALPHABET )) {
37+ throw new InvalidBase62Encoding (value: $ value );
38+ }
39+
3440 $ bytes = 0 ;
3541
3642 while (!empty ($ value ) && str_starts_with ($ value , self ::BASE62_ALPHABET [0 ])) {
@@ -42,9 +48,10 @@ public static function decode(string $value): string
4248 return str_repeat ("\x00" , $ bytes );
4349 }
4450
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 );
4653
47- if (strlen ($ hexadecimal ) % 2 !== 0 ) {
54+ if (strlen ($ hexadecimal ) % 2 ) {
4855 $ hexadecimal = '0 ' . $ hexadecimal ;
4956 }
5057
0 commit comments