diff --git a/tests/base32_test.aer b/tests/base32_test.aer new file mode 100644 index 0000000..5fd43f5 --- /dev/null +++ b/tests/base32_test.aer @@ -0,0 +1,75 @@ +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 { + 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======')); + } +} diff --git a/tests/base32_test.exp b/tests/base32_test.exp new file mode 100644 index 0000000..893425a --- /dev/null +++ b/tests/base32_test.exp @@ -0,0 +1,6 @@ +string(24 'KRSXG5BAKN2HE2LOM4======') +string(16 'IRJTEN2EIVBTSOBV') +string(32 'IFSXEU3DOJUXA5BAOJXWG23TEE======') +string(11 'Test String') +string(10 'DS27DEC985') +string(16 'AerScript rocks!') \ No newline at end of file