Groovy调用reverse()反转字节数组报错及版本格式优化问题
问题解决:大端序版本字符串转换及Groovy数组反转报错处理
错误原因分析
Groovy中byte[](即[B类型)没有内置的reverse()方法,直接调用会抛出MissingMethodException。另外原代码将每个字节固定格式化为两位十六进制字符串,无法实现非零字节的前导零去除需求。
修正方案
1. 数组反转的正确实现
可以通过两种方式实现byte数组的反转:
- 方式一:转为List反转后转回数组
利用Groovy对List的reverse()方法,先将byte数组转为List,反转后再转回byte数组。 - 方式二:使用Java的Arrays工具类
借助java.util.Arrays的reverse()方法,注意需要先复制原数组避免修改原数据。
2. 前导零处理逻辑
对每个反转后的字节,转换为十六进制字符串后:
- 如果字符串是
00,保留两位 - 如果字符串以
0开头且非00,截取第二位字符 - 其他情况直接保留原字符串
完整修正代码
import java.util.Arrays def version = '4C00020B' byte[] byteVersion = version.decodeHex() // 方式一:转List反转 // byte[] byteReversed = byteVersion.toList().reverse().toArray(new byte[0]) // 方式二:使用Arrays工具类(推荐,性能更优) byte[] byteReversed = Arrays.copyOf(byteVersion, byteVersion.length) Arrays.reverse(byteReversed) def versionStr = byteReversed.collect { String hex = String.format('%02X', it) hex == '00' ? hex : hex.replaceFirst('^0', '') }.join('.') println versionStr // 输出:B.2.00.4C
代码说明
- 数组反转:使用
Arrays.copyOf复制原数组后调用Arrays.reverse,避免修改原始的byteVersion数组,同时实现反转效果。 - 前导零处理:通过三元表达式和正则替换,精准处理非零字节的前导零去除,同时保留
00的两位格式。
内容的提问来源于stack exchange,提问作者ek777
相关产品推荐
相关产品推荐

