= $bits) { $n -= $bits; $out .= $alphabet[($acc >> $n) & $mask]; } } if ($n > 0) $out .= $alphabet[($acc << ($bits - $n)) & $mask]; $rest = strlen($out) % $block; return $rest ? $out.str_repeat('=', $block - $rest) : $out; } private static function decode(string $text, string $alphabet, int $bits): string { $out = ''; $acc = 0; $n = 0; for ($i = 0, $len = strlen($text); $i < $len; $i++) { $v = strpos($alphabet, $text[$i]); if ($v === false) throw new \InvalidArgumentException('不正な文字があります。'); $acc = (($acc << $bits) | $v) & 0xffff; $n += $bits; if ($n >= 8) { $n -= 8; $out .= chr(($acc >> $n) & 0xff); } } return $out; } }