Browse Source

Real life test - base32.

release/v0.1
Rafal Kupiec 1 year ago
parent
commit
f8a47d2838
Signed by: belliash GPG Key ID: 4E829243E0CFE6B4
2 changed files with 81 additions and 0 deletions
  1. +75
    -0
      tests/base32_test.aer
  2. +6
    -0
      tests/base32_test.exp

+ 75
- 0
tests/base32_test.aer View File

@ -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======'));
}
}

+ 6
- 0
tests/base32_test.exp View File

@ -0,0 +1,6 @@
string(24 'KRSXG5BAKN2HE2LOM4======')
string(16 'IRJTEN2EIVBTSOBV')
string(32 'IFSXEU3DOJUXA5BAOJXWG23TEE======')
string(11 'Test String')
string(10 'DS27DEC985')
string(16 'AerScript rocks!')

Loading…
Cancel
Save