0

有谁知道类似于 base64_encode/decode 的编码/解码功能,但它只输出数字和/或字母,因为 base64 有时会输出 =,这会弄乱我的代码。谢谢

4

2 回答 2

1

Base64 不是加密。我建议您了解加密的含义。但无论如何,听起来你想要的是 Base32 编码。在 Python 中,你可以通过做得到它

base64.b32encode(data)

编辑:base32 编码默认也使用 = 填充,但如果它导致问题,您可以简单地省略填充。

base64.b32encode(data).rstrip('=')
于 2012-07-28T13:42:59.370 回答
0

这是我为自己编写的 owncloud 应用程序创建的算法。您可以指定自己的字母表,因此可能值得一试。该实现是在 php 中,但可以很容易地移植。

  /**
   * @method randomAlphabet
   * @brief Creates a random alphabet, unique but static for an installation
   * @access public
   * @author Christian Reiner
   */
  static function randomAlphabet ($length)
  {
    if ( ! is_integer($length) )
      return FALSE;
    $c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxwz0123456789";
    return substr ( str_shuffle($c), 0, $length );
  } // function randomAlphabet

  /**
   * @method OC_Shorty_Tools::convertToAlphabet
   * @brief Converts a given decimal number into an arbitrary base (alphabet)
   * @param integer number: Decimal numeric value to be converted
   * @return string: Converted value in string notation
   * @access public
   * @author Christian Reiner
   */
  static function convertToAlphabet ( $number, $alphabet )
  {
    $alphabetLen = strlen($alphabet);
    if ( is_numeric($number) )
         $decVal = $number;
    else throw new OC_Shorty_Exception ( "non numerical timestamp value: '%1'", array($number) );
    $number = FALSE;
    $nslen = 0;
    $pos = 1;
    while ($decVal > 0)
    {
      $valPerChar = pow($alphabetLen, $pos);
      $curChar = floor($decVal / $valPerChar);
      if ($curChar >= $alphabetLen)
      {
        $pos++;
      } else {
        $decVal -= ($curChar * $valPerChar);
        if ($number === FALSE)
        {
          $number = str_repeat($alphabet{1}, $pos);
          $nslen = $pos;
        }
        $number = substr($number, 0, ($nslen - $pos)) . $alphabet{(int)$curChar} . substr($number, (($nslen - $pos) + 1));
        $pos--;
      }
    }
    if ($number === FALSE) $number = $alphabet{1};
    return $number;
  }
于 2012-07-28T13:45:47.400 回答