将字符串编码为Base36

时间:2017-01-13 11:39:07

标签: java string algorithm biginteger base36

目前我正在使用一种算法来编码一个普通字符串,每个字符都包含一个Base36字符串。

我尝试了以下但是它没有用。

public static String encode(String str) {
    return new BigInteger(str, 16).toString(36);
}

我猜它是因为字符串不仅仅是十六进制字符串。如果我使用字符串" Hello22334!"在Base36中,我得到NumberFormatException

我的方法是将每个字符转换为数字。将数字转换为十六进制表示,然后将hexstring转换为Base36。

我的方法是否正常还是有更简单或更好的方式?

2 个答案:

答案 0 :(得分:12)

首先,您需要将字符串转换为数字,由一组字节表示。这是你使用编码的。我强烈推荐UTF-8。

然后你需要将这个数字,一组字节转换成一个字符串,基数为36。

HashMap1

解码:

byte[] bytes = string.getBytes(StandardCharsets.UTF_8); 
String base36 = new BigInteger(1, bytes).toString(36);
byte[] bytes = new Biginteger(base36, 36).toByteArray();
// Thanks to @Alok for pointing out the need to remove leading zeroes.
int zeroPrefixLength = zeroPrefixLength(bytes);
String string = new String(bytes, zeroPrefixLength, bytes.length-zeroPrefixLength, StandardCharsets.UTF_8));

答案 1 :(得分:1)

从 Base10 到 Base36

public static String toBase36(String str) {
        try {
            return Long.toString(Long.valueOf(str), 36).toUpperCase();
        } catch (NumberFormatException | NullPointerException ex) {
            ex.printStackTrace();
        }
        return null;
    }

从 Base36String 到 Base10

public static String fromBase36(String b36) {
        try {
            BigInteger base = new BigInteger( b36, 36);
            return base.toString(10);
        }catch (Exception e){
             e.printStackTrace();
        }
       return null;
    }