Java实现Base45编解码新冠数字证书时出现数组越界错误如何解决?
异常根因
- Java的
byte为带符号数据类型,取值范围是-128 ~ 127,你使用的Base45编码器实现未兼容Java带符号字节的特性,默认要求输入字节对应的数值为无符号的0 ~ 255区间。 - 当解码得到的
bytecompressed数组中存在负数字节时,编码器计算value % 45会得到负数结果,用负数作为下标访问长度仅为45的toBase45常量数组,直接触发数组越界异常。
解决方案
两种修复方式二选一即可:
方式1:修改Base45库的编码逻辑(推荐)
直接修改报错的Base45.java第74行附近的取值逻辑,对输入字节先做无符号转换再计算:
// 原代码 // result[resultIndex++] = toBase45[value % 45]; // 修改后,先把value转为无符号0-255区间再取模 result[resultIndex++] = toBase45[(value & 0xFF) % 45];
如果value的取值本身就来自输入byte的直接赋值,也可以在给value赋值的步骤就做无符号转换:
int value = inputBytes[i] & 0xFF;
方式2:编码前预处理输入字节数组
如果不想修改第三方库代码,可以在调用编码器前,先对输入的字节数组做无符号适配:
byte[] bytecompressed = Base45.getDecoder().decode(withoutPrefix); // 预处理:兼容带符号字节的编码需求 byte[] unsignedInput = new byte[bytecompressed.length]; for (int i = 0; i < bytecompressed.length; i++) { unsignedInput[i] = (byte) (bytecompressed[i] & 0xFF); } byte[] byteCompressedNew = Base45.getEncoder().encode(unsignedInput);
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

