目前,我正在研究一种算法,将包含每个可能字符的普通字符串编码为Base36字符串。
我已经尝试了以下方法,但不起作用。
public static String encode(String str) {
return new BigInteger(str, 16).toString(36);
}我猜这是因为字符串不仅仅是十六进制字符串。如果我使用字符串"Hello22334!“在Base36中,我得到了一个NumberFormatException。
我的方法是将每个字符转换为一个数字。将数字转换为十六进制表示,然后将十六进制字符串转换为Base36。
我的方法可以吗?或者有更简单或更好的方法吗?
发布于 2017-01-13 19:45:52
首先,您需要将字符串转换为一个由一组字节表示的数字。这就是你使用编码的目的。我强烈推荐使用UTF-8。
然后,您需要将该数字、字节集转换为以36为基数的字符串。
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));private int zeroPrefixLength(final byte[] bytes) {
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] != 0) {
return i;
}
}
return bytes.length;
}发布于 2021-07-09 04:29:52
从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;
}https://stackoverflow.com/questions/41633821
复制相似问题