目前我正在使用一种算法来编码一个普通字符串,每个字符都包含一个Base36字符串。
我尝试了以下但是它没有用。
public static String encode(String str) {
return new BigInteger(str, 16).toString(36);
}
我猜它是因为字符串不仅仅是十六进制字符串。如果我使用字符串" Hello22334!"在Base36中,我得到NumberFormatException
。
我的方法是将每个字符转换为数字。将数字转换为十六进制表示,然后将hexstring转换为Base36。
我的方法是否正常还是有更简单或更好的方式?
答案 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;
}