【问题标题】:Base36 Encode a String?Base36 编码字符串?
【发布时间】:2011-05-18 18:54:28
【问题描述】:

我一直在网上寻找,但找不到解决此问题的方法。在 Python、Ruby 或 Java 中,如何以 36 为基数对以下字符串进行编码:nOrG9Eh0uyeilM8Nnu5pTywj3935kW+5=

【问题讨论】:

  • 编码还是解码?它看起来是经过编码的。
  • 这与密码学无关
  • 我想对该字符串进行编码,然后在 Base36 中将其解码。我只是想知道这是否可能。
  • 致所有共享代码以编码数字的人,谢谢,但我正在尝试对字符串进行编码。如果这是不可能的,请原谅我。不过,我看到可以基于 64 位编码字符串的库。
  • @SLaks Encryption 还包括非常幼稚的算法;)

标签: java python ruby


【解决方案1】:

红宝石


以 36 为基数:

s.unpack('H*')[0].to_i(16).to_s 36

从 36 进制开始:

[s36.to_i(36).to_s(16)].pack 'H*'

【讨论】:

  • 非常好,DigitalRoss。谢谢。
【解决方案2】:

看起来维基百科有一篇关于如何在 python 中做到这一点的文章: http://en.wikipedia.org/wiki/Base_36

【讨论】:

    【解决方案3】:

    我刚刚这样做了:

      static String encodeRootId(final String value) {
        try {
          final BigInteger bigInteger = new BigInteger(value.getBytes("UTF-8"));
          final String encoded = bigInteger.toString(Character.MAX_RADIX);
    
          //must encode the sign as well
          if (bigInteger.signum() < 0) {
            return 'n' + encoded.substring(1);
          } else {
            return 'p' + encoded;
          }
        } catch (UnsupportedEncodingException e) {
          throw new RuntimeException("impossible");
        }
      }
    

    将字符串 bytes[] 转换为大 int 的技巧带来了必须手动对可能的 - 进行编码的缺点,诚然不漂亮,但一个快速的解决方案。

    另外,在我的用例中,我不必解码,性能也不是问题。

    【讨论】:

      【解决方案4】:

      这可以看作是另一个问题的重复...Python base 36 encoding

      基本上,维基百科上有这个例子:

      def base36encode(number, alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
          """Convert positive integer to a base36 string."""
          if not isinstance(number, (int, long)):
              raise TypeError('number must be an integer')
      
          # Special case for zero
          if number == 0:
              return alphabet[0]
      
          base36 = ''
      
          sign = ''
          if number < 0:
              sign = '-'
              number = - number
      
          while number != 0:
              number, i = divmod(number, len(alphabet))
              base36 = alphabet[i] + base36
      
          return sign + base36
      
      def base36decode(number):
          return int(number, 36)
      
      print base36encode(1412823931503067241)
      print base36decode('AQF8AA0006EH')
      

      维基百科页面:http://en.wikipedia.org/wiki/Base_36

      【讨论】:

      • 这回答了如何以 36 为基数编码一个数值而不是字符串的问题。
      • base36 是关于编码数字
      • @Bradford:只需将您的字符串转换为数字并对其进行编码。反转解码步骤。例如,如果您使用 8 位字符,请将每个字符代码视为 Base 256 数字。
      • @Bradford:这是将 8 位字符串转换为数字的快速方法:reduce(lambda a,d: a*256 + ord(d), astring, 0)
      • 哇。非常感谢马蒂诺。这实际上是我一直在寻找的答案。用 divmod 也很容易反转。
      猜你喜欢
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2015-09-04
      • 2016-10-12
      • 2013-12-29
      • 1970-01-01
      • 2015-08-25
      相关资源
      最近更新 更多