76 lines
2.7 KiB
Plaintext
76 lines
2.7 KiB
Plaintext
class Base32 {
|
|
private static char[] $map = {
|
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
|
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
|
'Y', 'Z', '2', '3', '4', '5', '6', '7',
|
|
'='
|
|
};
|
|
|
|
private static int[] $flippedMap = {
|
|
'A'=>0, 'B'=>1, 'C'=>2, 'D'=>3, 'E'=>4, 'F'=>5, 'G'=>6, 'H'=>7,
|
|
'I'=>8, 'J'=>9, 'K'=>10, 'L'=>11, 'M'=>12, 'N'=>13, 'O'=>14, 'P'=>15,
|
|
'Q'=>16, 'R'=>17, 'S'=>18, 'T'=>19, 'U'=>20, 'V'=>21, 'W'=>22, 'X'=>23,
|
|
'Y'=>24, 'Z'=>25, '2'=>26, '3'=>27, '4'=>28, '5'=>29, '6'=>30, '7'=>31
|
|
};
|
|
|
|
public static string encode(string $input, bool $padding = true) {
|
|
if(!$input) return '';
|
|
char[] $aInput = str_split($input);
|
|
string $binaryString = '';
|
|
for(int $i = 0; $i < sizeof($aInput); $i++) {
|
|
$binaryString += str_pad(base_convert(ord($aInput[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
|
|
}
|
|
string[] $fiveBitBinaryArray = str_split($binaryString, 5);
|
|
string $base32 = '';
|
|
$i = 0;
|
|
while($i < sizeof($fiveBitBinaryArray)) {
|
|
$base32 += self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];
|
|
$i++;
|
|
}
|
|
int $x;
|
|
if($padding && ($x = strlen($binaryString) % 40) != 0) {
|
|
if($x == 8) $base32 += str_repeat(self::$map[32], 6);
|
|
else if($x == 16) $base32 += str_repeat(self::$map[32], 4);
|
|
else if($x == 24) $base32 += str_repeat(self::$map[32], 3);
|
|
else if($x == 32) $base32 += self::$map[32];
|
|
}
|
|
return $base32;
|
|
}
|
|
|
|
public static string decode(string $input) {
|
|
if(!$input) return '';
|
|
int $paddingCharCount = substr_count($input, self::$map[32]);
|
|
int[] $allowedValues = {6, 4, 3, 1, 0};
|
|
if(!in_array($paddingCharCount, $allowedValues)) return NULL;
|
|
for(int $i = 0; $i < 4; $i++) {
|
|
if($paddingCharCount == $allowedValues[$i] && substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i]))
|
|
return false;
|
|
}
|
|
$input = str_replace('=','', $input);
|
|
char[] $aInput = str_split($input);
|
|
string $binaryString = '';
|
|
for($i = 0; $i < sizeof($aInput); $i = $i + 8) {
|
|
string $x = '';
|
|
if(!in_array($input[$i], self::$map))
|
|
return false;
|
|
for(int $j = 0; $j < 8; $j++) {
|
|
$x += str_pad(base_convert(self::$flippedMap[$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
|
|
}
|
|
string[] $eightBits = str_split($x, 8);
|
|
for(int $z = 0; $z < sizeof($eightBits); $z++) {
|
|
char $y;
|
|
$binaryString += (($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48) ? $y : '';
|
|
}
|
|
}
|
|
return $binaryString;
|
|
}
|
|
}
|
|
|
|
class Program {
|
|
public void main() {
|
|
var_dump(Base32::encode('Test String'), Base32::encode('DS27DEC985'), Base32::encode('AerScript rocks!'));
|
|
var_dump(Base32::decode('KRSXG5BAKN2HE2LOM4======'), Base32::decode('IRJTEN2EIVBTSOBV'), Base32::decode('IFSXEU3DOJUXA5BAOJXWG23TEE======'));
|
|
}
|
|
}
|