Java Base36编码字符串?

Java Base36编码字符串?,java,python,ruby,Java,Python,Ruby,我一直在网上找,但找不到解决办法。在Python、Ruby或Java中,如何以36为基数对以下字符串进行编码:nOrG9Eh0uyeilM8Nnu5pTywj3935kW+5=看起来维基百科有一篇关于如何在Python中进行编码的文章: 这可以看作是另一个问题的重复 基本上,维基百科上有这样一个例子: def base36encode(number, alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'): """Convert positive

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

看起来维基百科有一篇关于如何在Python中进行编码的文章:

这可以看作是另一个问题的重复

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

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')
def base36encode(数字,字母表='0123456789ABCDEFGHIjklmnopqrstuvxyz'):
“”“将正整数转换为base36字符串。”“”
如果不是isinstance(数字,(int,long)):
raise TypeError('数字必须是整数')
#零的特殊情况
如果数字==0:
返回字母表[0]
base36=“”
符号=“”
如果数字<0:
符号='-'
数字=-数字
而数字!=0:
数字,i=divmod(数字,len(字母))
base36=字母表[i]+base36
返回标志+base36
def BASE36解码(编号):
返回整数(数字,36)
打印base36encode(141282393153067241)
打印base36解码('AQF8AA0006EH')
维基百科页面:

Ruby
以36为基数:

从基36开始:

我刚刚做了这件事:

  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");
    }
  }
静态字符串encodeRootId(最终字符串值){
试一试{
final biginger biginger=新的biginger(value.getBytes(“UTF-8”);
编码的最终字符串=bigInteger.toString(Character.MAX\u基数);
//也必须对符号进行编码
if(biginger.signum()<0){
返回'n'+已编码的子字符串(1);
}否则{
返回'p'+编码;
}
}捕获(不支持的编码异常e){
抛出新的运行时异常(“不可能”);
}
}
将字符串字节[]转换为大整数的技巧带来了一个缺点,即必须手动编码可能的-,虽然不漂亮,但却是一个快速的解决方案


另外,在我的用例中,我不需要解码,性能也不重要。

编码还是解码?它看起来已编码。这与加密无关。我想对该字符串进行编码,然后在Base36中对其进行解码。我只是想知道这是否有可能。感谢所有共享编码的人,谢谢,但我正在尝试编码一个字符串。如果那不可能,请原谅。不过,我看到一些库可以对字符串进行base64编码。@SLaks加密还包括一些非常幼稚的算法;)这回答了如何以36为基数编码数值而不是字符串的问题。base36是关于编码数字的only@Bradford:只需将字符串转换为数字并编码即可。颠倒解码步骤。例如,如果您使用8位字符,则将每个字符代码看作是一个256位数字。@ Bradford:这里有一种将8位字符串转换成数字的快速方法:<代码>还原(lambda a,d:a* 256 + Od(d),Actring,0)< /C> >。谢谢你,马提诺。这就是我想要的答案。使用divmod也很容易反转。非常好,DigitalRoss。谢谢
[s36.to_i(36).to_s(16)].pack 'H*'
  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");
    }
  }