进制转换工具类-RadixUtil
# 📚 介绍
RadixUtil 是 Hutool 核心模块中的进制转换工具类,可以实现任意进制之间的转换,为 Java 开发者提供了便捷的进制转换解决方案。
# 设计理念
- 任意进制:支持自定义进制字符集,实现任意进制之间的转换
- 简单易用:提供简洁的 API,一行代码即可完成进制转换
- 高性能:底层实现经过优化,性能优异
- 线程安全:所有方法都是线程安全的,可以在多线程环境下安全使用
# 🔧 核心方法详解
# 1. 进制编码
# encode(long value, String chars)
功能:把一个整型数值转换成自定义进制
参数:
value:要转换的数值chars:进制字符集,不同的字符代表不同的进制位
返回值:转换后的进制字符串
示例:
// 使用默认的62进制字符集(0-9a-zA-Z)
String base62 = RadixUtil.encode(123456, RadixUtil.BASE_CHARSET);
Console.log(base62); // 2n9
// 自定义进制字符集
String customRadix = RadixUtil.encode(123456, "abcdefghijklmnopqrstuvwxyz");
Console.log(customRadix); // dnhlz
# 2. 进制解码
# decodeToInt(String value, String chars)
功能:把转换后的进制字符还原成int值
参数:
value:要转换的进制字符串chars:进制字符集
返回值:转换后的int值
示例:
// 解码62进制字符串
int value1 = RadixUtil.decodeToInt("2n9", RadixUtil.BASE_CHARSET);
Console.log(value1); // 123456
// 解码自定义进制字符串
int value2 = RadixUtil.decodeToInt("dnhlz", "abcdefghijklmnopqrstuvwxyz");
Console.log(value2); // 123456
# decode(String value, String chars)
功能:把转换后的进制字符还原成long值
参数:
value:要转换的进制字符串chars:进制字符集
返回值:转换后的long值
示例:
// 解码62进制字符串为long
long value = RadixUtil.decode("2n9", RadixUtil.BASE_CHARSET);
Console.log(value); // 123456
// 解码大数值
String largeNum = RadixUtil.encode(Long.MAX_VALUE, RadixUtil.BASE_CHARSET);
long decodedLargeNum = RadixUtil.decode(largeNum, RadixUtil.BASE_CHARSET);
Console.log(decodedLargeNum); // 9223372036854775807
# 🚀 综合示例
# 示例1:自定义进制转换
public void customRadixTest() {
// 定义自定义进制字符集(只使用数字和小写字母)
String customChars = "0123456789abcdefghijklmnopqrstuvwxyz";
// 要转换的数值
long num = 123456789L;
// 编码为自定义进制
String encoded = RadixUtil.encode(num, customChars);
Console.log("编码结果:" + encoded); // 21i3v9
// 解码回原值
long decoded = RadixUtil.decode(encoded, customChars);
Console.log("解码结果:" + decoded); // 123456789
// 验证编码解码是否正确
Assert.assertEquals(num, decoded);
}
# 示例2:实现Base62编码
public void base62Test() {
// Base62编码就是使用0-9a-zA-Z作为字符集
String base62Chars = RadixUtil.BASE_CHARSET;
// 编码
String base62 = RadixUtil.encode(123456, base62Chars);
Console.log("Base62编码:" + base62); // 2n9
// 解码
long decoded = RadixUtil.decode(base62, base62Chars);
Console.log("Base62解码:" + decoded); // 123456
}
# 示例3:进制转换应用 - 生成短链接
public void shortUrlTest() {
// 假设我们有一个长URL对应的ID
long urlId = 123456789L;
// 使用62进制转换生成短链接标识
String shortCode = RadixUtil.encode(urlId, RadixUtil.BASE_CHARSET);
Console.log("短链接标识:" + shortCode); // 8m0k
// 当用户访问短链接时,解码得到原始ID
long decodedId = RadixUtil.decode(shortCode, RadixUtil.BASE_CHARSET);
Console.log("解码得到的URL ID:" + decodedId); // 123456789
// 根据ID查询数据库,获取原始URL
// String originalUrl = urlService.getUrlById(decodedId);
}
# 🎯 设计优势
- 灵活定制:支持自定义进制字符集,可以根据需求实现任意进制的转换
- 高性能:底层使用位运算和查表法,性能优异
- 简单易用:提供简洁的API,一行代码即可完成进制转换
- 线程安全:所有方法都是线程安全的,可以在多线程环境下安全使用
- 支持大数值:支持long类型的数值转换,可以处理较大的数值
# 📌 注意事项
- 字符集唯一性:自定义字符集的字符必须唯一,否则会导致解码错误
- 字符集长度:字符集的长度决定了进制数,例如字符集长度为62,则表示62进制
- 数值范围:对于int类型的解码,要注意数值不能超过int的范围(-2^31到2^31-1)
- 大小写敏感:默认字符集是大小写敏感的,"A"和"a"代表不同的进制位
- 空值处理:输入参数为null时会抛出NullPointerException,需要注意处理
# 🚀 总结
RadixUtil 是一个功能强大、使用便捷的进制转换工具类,为 Java 开发者提供了灵活的进制转换解决方案。它支持自定义进制字符集,可以实现任意进制之间的转换,适用于各种进制转换场景,如短链接生成、自定义ID生成等。
通过合理使用 RadixUtil,可以简化进制转换的开发工作,提高开发效率,同时保证转换的准确性和性能。