You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:30:06